GA/GTMを使った際に見えなくなるトラッカーを呼び出して処理を実行する


GoogleアナリティクスとGoogleタグマネージャーのマニアックな話題。

通常GoogleアナリティクスをGoogleタグマネージャーを使って設置すると、
GAのビーコンを呼び出す際のトラッカー名はGTMによってランダムな
名前のものが割り当てられる。
たとえばこんな「gtm1463146770599」形式のものである。

そうなると生成したトラッカーそのものを使って何らかの処理をすることが難しい。

GTMの設定の中で固定のトラッカー名を付与すればこの問題は発生しないが、
大人の事情でGTMの設定権限を与えられていない場合もある。

生成したトラッカーからさまざまな情報を取得したり、
その情報に基づいて何らかの処理を行ったりしたい場合にどうすればいいか。

そのプロパティで新たにトラッカーを作り直してもいい
ga('create', 'プロパティID', 'auto')する)ケースはある。
たとえばイベントをsendするのは新規トラッカーでも問題はない。

ただトラッカーに(ヒット単位の)カスタムディメンションが設定されており、
そのカスタムディメンションを使って何らかの処理をしたい場合などは新規のトラッカーでは無理である。

GAのトラッカーオブジェクトはどこにあるのか

windowオブジェクトの中にあるwindow.gaがGAのトラッカーやメソッドを含む
GAのすべてを保持したオブジェクトになる。

このgaオブジェクトからメソッドga.getAll()でそのページにおけるすべてのトラッカー(インスタンス)を配列で抽出できる。

var trackers = ga.getAll();

trackers[0], trackers[1], ...がそれぞれのトラッカーインスタンスになる。
プロパティIDが1個しかない場合はtrackers[0]がそのトラッカーになる。

ちなみに

var tracker = ga.getByName('名前');

で指定した名前のトラッカーインスタンスを呼び出せるが、そもそもGTMを使うとこれがランダムな文字列になるため扱えない

トラッカーに付けられたさまざまな変数の値は

var varname = trackers[i].get('変数名')

で取得できる。しかし変数名が分からないと使えないので意味がない

変数の詳細はオブジェクトtrackers[i].b.dataからアクセスできる。
変数名の配列がtrackers[i].b.data.keysで、変数名と値の組のハッシュオブジェクトがtrackers[i].b.data.valuesになる。厳密にはハッシュオブジェクトのキー名は:変数名という形式になっている。

プロパティが1個しかない場合、ga.getAll()[0].b.data.valuesがトラッカー内の変数のすべてということになる。

ちなみにトラッカー名が変数名name、プロパティIDがtrackingIdとなる。これらの値を取得するには

  • trackers[i].b.data.values[':name']
  • trackers[i].b.data.values[':trackingId']

でアクセスできるが、実際にはを使うのが安全である。

  • trackers[i].get('name')
  • trackers[i].get('trackingId')

プロパティIDを指定してトラッカーを呼び出す実装

以上を前提に指定したプロパティIDのトラッカーを取得するには

if (typeof ga !== 'function') {
    var gaAlias = window['GoogleAnalyticsObject'] || 'ga';
    window[gaAlias] = window[gaAlias] || function() {
        (window[gaAlias]['q'] = window[gaAlias]['q'] || []).push(arguments);
    };
}
ga(function(trackingId) {
    return function(){
        var trackers = ga.getAll();
        for (var i = 0, j = trackers.length; i < j; i++) {
            var t = trackers[i].get('trackingId');
            if (trackers[i].get('trackingId') == trackingId) {
                /* トラッカーに対して行う処理 */
                // 例1:クライアントIDを取得
                var cid = trackers[i].get('clientId');

                // 例2-1:page viewをsendする
                trackers[i].send('pageview', {'page': '/index1.html'});
                // 例2-2:一応こうしてもできるけど…
                ga(trackers[i].get('name') + '.send', 'pageview', {'page': '/index2.html'});

                // 例3:カスタムディメンション1を取得し、その値をラベルに指定してイベントをsendする。
                var cd1 = trackers[i].get('dimension1');
                trackers[i].send('event', 'coupon', 'view', cd1, { nonInteraction: true });
                /* ここまでトラッカーに対して行う処理 */
                break;
            }
        }
    };
}('UA-XXXXXXXX-Y'));

if (typeof ga !== 'function') { ... }の処理は、GAインスタンスが生成されていないタイミングでga()関数が実行された場合の処理(GAインスタンス生成後に実行する)になる。

誰の役に立つかは分からないけど、超絶にマニアックなトピックでした。