GTM中使用JavaScript map函数处理dataLayer获取目标JSON输出
你出现问题的核心原因:
你分开提取商品数量和名称的两个变量返回的是数组,直接以字符串插值的方式写入对象时,JS会自动将数组转为逗号拼接的字符串,同时你初始化lineitems时只写了一个对象结构,自然无法生成多个商品对应的数组项。
解决方案
不需要拆分两个变量单独取值,直接创建一个自定义JS变量,一次性构造你需要的完整结构即可,代码如下:
function() { // 沿用你已有的存储products数组的dataLayer变量 const products = {{DLV - Product Name}}; // 容错处理,避免商品数组未加载时触发报错 if (!Array.isArray(products)) return { lineitems: [] }; return { lineitems: products.map(prod => ({ productName: prod.name, // 如果不需要末尾带逗号,把 + ',' 删掉即可,要数字类型就直接写prod.quantity quantity: prod.quantity + ',' })) } }
之后你直接在主标签里引用这个新的自定义JS变量就行,不需要自己手动拼接结构。
调试显示异常问题解决
GTM预览模式下显示google_tag_manager[XXX].macro(187)属于正常现象,这是预览面板对自定义JS变量的引用标识,不是没有计算成功。你可以通过两种方式验证返回值:
- 在自定义JS变量的代码中加入
console.log()打印返回对象,在浏览器控制台查看输出 - 在标签中使用变量时先做JSON序列化,比如
JSON.stringify({{你新建的自定义JS变量名}}),就能看到完整的JSON结构
小提示:请确保这个自定义JS变量的触发时机在ecommerce purchase事件被push到dataLayer之后,避免取到空值。
内容的提问来源于stack exchange,提问作者UgoL
相关产品推荐
相关产品推荐

