【问题标题】:Google Tag Manager is returning undefined from Google Analytics Legacy Client ID that existsGoogle 跟踪代码管理器从存在的 Google Analytics(分析)旧版客户端 ID 返回未定义
【发布时间】:2017-05-09 00:20:32
【问题描述】:

我正在为使用 Google Analytics Classic 的客户开发网站。他们目前没有升级。他们正在使用 Google 跟踪代码管理器,并希望我通过 GTM(我已经能够完成)从 Google Analytics Classic 获取客户端 ID,然后使用 GTM 将其发送到分析。我有它,以便它在检测到该 ID 时触发一个标签,但是当我使用我创建的变量发送该 ID 时,它返回未定义的 95%。

被触发的标签是我的 SendToAnalytics。它是经典的 Google Analytics 标记类型。它由 WindowLoadedWithValidID 触发,当我的变量 CheckForClientID 代码不返回 false 时触发。变量 CheckForClientID 的代码是:

    function() {

        var getClientId = function () {
            try {
                ga(function (tracker) {
                    if (tracker != undefined) {
                         var clientId = tracker.get('clientId');
                         return clientId;
                    } else {
                        return false;
                    }
                });
            } catch (e) {
                if (e) {
                    return false;
                }
            }
        }
      getClientId();
    }

我的标签 SendToAnalytics 是我遇到问题的地方。它是一种页面视图跟踪类型,它创建一个自定义变量以发送给 GA。该变量的值在 95% 的时间内返回未定义。我已经尝试了很多方法来获得这个价值。我用过和上面类似的代码,我用过:

function(){

 var clientID = ga.getAll()[0].get('clientId');
 return clientID;

}

还有其他我能想到的。它几乎总是返回 undefined,即使它在另一个触发器触发之后触发,这取决于正在加载的 GA 脚本。

我知道 GA 代码是异步的,但是一旦这个标签被触发,那是因为 GA 脚本已经加载,否则它会继续返回 false。返回 undefined 的变量让我感到困惑,因为它不应该在这个标签被触发之后才初始化,因此应该已经加载了 GA 脚本,或者这是错误的吗? GTM 是否会在看到标签存在时立即初始化变量,无论它是否已被触发?如果是这种情况,我将如何获取该变量的值以返回 clientID 而不是未定义?

【问题讨论】:

  • 你的内部函数只有在没有 id 或者出现异常的情况下才会返回。外部函数根本不返回任何内容,所以更大的谜团是为什么这在 5% 的情况下会起作用。
  • 在无数次尝试让代码完成我希望的事情后,我提出了这个问题。我编写的代码是我尝试将其恢复为最有效的代码。我忘了放退货声明。我为刚才的问题修复了它,但是之后的代码仍然不能作为变量工作。它触发了标签,但标签没有像我希望的那样获得变量。它返回未定义。

标签: javascript google-analytics google-tag-manager


【解决方案1】:

正如 cmets 所说,不确定您的功能为何实际工作,如果该帐户确实是旧帐户,则以下功能必须什么都不做。

函数(){

var clientID = ga.getAll()[0].get('clientId');返回客户端ID;

}

你现在要做的事:

1.- 读取 cookie 并获取第二个值 我创建了以下变量:

2.- 创建一个自定义 JS,这是第一次读取 cookie(最快的方式),如果不可用,他们会读取跟踪器元素,如果一切都无法创建 Google Analytics 对象并获取客户端ID,替换该脚本上的UA,这种情况只会发生在新用户的第一页上。这样可以避免没有客户端 ID 的命中。

function(){
    var cookie_utma= {{cookie - utma}};
    if(typeof cookie_utma != "undefined"){
      return cookie_utma.split(".")[1];
    }
    if(typeof _gat != "undefined")
    {
       return _gat._getTrackerByName()._visitCode();
    } 
      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-XXXXX-X']); //change with you UA to avoid issues 
      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();
  return _gat._getTrackerByName()._visitCode();
}

【讨论】:

  • 我在无数次不同的代码尝试之后写下了这个问题。我用于这个问题的代码是我试图将它恢复到我记得工作得最好的状态。我忘记了退货声明。如果它是旧帐户,则以下代码不起作用 - 如果我将返回更改为 console.log,我会在一段时间内获得帐号,通常是在我刷新 GTM 中的预览模式之后。我只是在开发人员工具中再次这样做,并且效果也很好。它总是在开发工具中工作,只是有时在代码中。
  • 我刚刚尝试了您的代码,它返回了 Google Analytics(分析)帐户。我正在尝试获取 google 用来跟踪用户的客户端 ID。
  • 嘿!抱歉,我混合了两个 ID(帐户和客户端),我更新了代码以检索客户端 ID,它也可以通过 cookie __utma 读取。但这可能很棘手。
  • 感谢您的修复。我确实在代码中发现了一个错字,但这会使代码无法按预期工作。在您的第一方 cookie 中,您的 cookie 名称为“_utma”,但实际上应该是带有 2 个下划线的“__utma”。你帮了我很多,我很感激!
  • 哦,是的,我会更新它,截图是错误的,但我的标签是好的,当我是 pess imp 时我应该删除它。谢谢你!
【解决方案2】:

我可以通过对我的变量使用以下代码来实现此功能,该变量是标签用来发送到 Google Analytics 的。

function(){
window.getCookie = function (cname) {
  if (document.cookie.length > 0) {
    cstart = document.cookie.indexOf(cname + "=");
    if (cstart != -1) {
      cstart = cstart + cname.length + 1;
      cend = document.cookie.indexOf(";", cstart);
      if (cend == -1) {
        cend = document.cookie.length;
      }
      return unescape(document.cookie.substring(cstart, cend));
      }
  }
  return 'not-available';
}


var GAuserID = getCookie('__utma');
var userId = GAuserID.split('.');
var clientId = userId[1] + '.' + userId[2];
return clientId;
}

【讨论】:

  • 这个解决方案可以满足我的需要,但是@Kemen 有一个更适合 GTM 的答案,所以我将其标记为正确答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多