Googleタグマネージャーで配列の中身を取得したい

JavaScriptの値をGoogleタグマネージャー(以下、GTM)で使用できるのは理解できているのですが、配列となった場合どうやら少し取得方法が異なる模様。例えば、以下のようなJavaScriptがあるとします。

var foo = [];
foo["bar"] = ["baz"];

グローバル変数(配列)fooを定義して、foo["bar"]要素の文字列値、"baz"を取得したい。そこでGTMの変数→ユーザー定義変数で以下のように設定します。

GTMで新規ユーザー定義変数追加

グローバル変数名にfoo["bar"]でなく連想配列名をドットでつなぐfoo.barと書きます。これをタグでカスタムHTMLを選択して、取得できているかテストします。

カスタムHTMLで変数を表示

保存した変数名(foo_bar)を{{}}で囲んで出力します。これをGTMのプレビューで確認すると表示されます。

GTMのプレビューでカスタムHTMLを確認

配列の要素数を取得したい

実はここからが本題で、配列の要素数を取得できないか探っていました。やりたいこととしては、GTMdata.Layerに配列の中身をpushして送信していたのですが、配列の中身がない場合でもタグが送信されていてエラーがでていました。

具体的に言うとcriteoというサービスのタグに商品情報を送信するにあたって、カートの中の商品の情報を送るようにしていました。ただ、カートが空の状態で「カートを見る」としてしまうと商品情報がないにも関わらずcriteoのタグに空の情報を送ってしまいエラーが出力されていたということ。

そこでカートの商品数が1以上であれば送信するというトリガーを作りたく配列の要素数が取れないか調べていました。すると以下のようにすることで取得できることが判明しました。

GTMのグローバル変数(配列)の要素数取得

length……そのまんまだ。この変数をトリガーに設定して先程の配列表示のタグにトリガー追加します。

GTMで配列の要素数が1以上だったらタグ表示

配列の要素数が1以上だったらタグを表示するようにトリガーセット!これでOKです。
できた!\(^o^)/

これで無駄なタグの配信など防げそう。JavaScript内でlength取得して分岐させてもいいけど、トリガーで設定しておいたほうがわかりやすいし、ON/OFFがすぐできるのでこの方法がベストと思われます。

参考サイト

タグマネージャ ヘルプ:変数
https://support.google.com/tagmanager/answer/6106899?hl=ja