如何在 GTM 中使用 javascript 替换 dataLayer 中的参数名称

Posted

技术标签:

【中文标题】如何在 GTM 中使用 javascript 替换 dataLayer 中的参数名称【英文标题】:How can I replace parameter names in the dataLayer using javascript in GTM 【发布时间】:2022-01-23 08:26:05 【问题描述】:

我有一个数组,其中包含我从 dataLayer 提取到 GTM 的电子商务订单信息。我已将此订单信息定义为一个变量,我想将其传递给支付完成事件的 TikTok 像素。

我面临的问题是 TikTok 像素期望键名“id”被称为“content_id”,键名“name”被称为“content_name”。我知道可以在 GTM 中使用自定义 javascript 变量执行搜索和替换,然后将编辑后的数组发送到像素。但我无法弄清楚如何使用 JavaScript 进行搜索和替换部分。这是我正在使用的,这是我的变量中的内容:

[
  
    id: "JBLANC015",
    name: "Blanc Diffuser, Maldivian Breeze",
    category: "Diffusers",
    price: "29.90",
    quantity: "3"
  ,
  
    id: "CH-AH-SHK-GREEN",
    name: "Hand Gesture Candle, Shaka  Green",
    category: "Candles",
    price: "39.90",
    quantity: "1"
  
]

这只是一个例子,数组可能包含更多或更少的产品,“id”和“name”的所有实例都需要替换为像素可以识别的正确实例。

这里是extra-explanatory screencast video,以防万一。

我试过这个:

function()
   var str = my array variable;
   return str.replace("id", "content_id");

但没有成功。

编辑。在理解了处理字符串和数组之间的区别之后,我得到了这样的东西,它可以一次更改一个键:

function()
var products = 
[
  
    name: "Hand Gesture Candle, Shaka  Green",
    id: "21834",
    price: "39.900000",
    brand: "Candlehand",
    category: "Candles"
  
]
;
products.forEach(function(obj) 
  obj.content_name = obj.name;
  delete obj.name;
);
return products;

这可以完成这项工作,但当我插入一个直接拉动数组并从网站直播的变量时就不行了。

function()
var products = my array variable;
products.forEach(function(obj) 
  obj.content_name = obj.name;
  delete obj.name;
);
return products;

当我将上面看到的这个版本与变量一起使用时,“name”键被删除,并且我没有在返回的数据中获得更改后的“content_name”键。毫无疑问,一些简单的事情让我无法理解。

Google Tag Manager > dataLayer variable find and replace with javascript variable 这里有一个类似的问题,但无法获得建议的答案来为我工作或从中提取工作解决方案。

对此的任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

如上所述,我将这个新答案发布到您更新的问题。

我也尝试了delete,但正如您所体验的那样,它也会删除分配的值。

但你也可以创建一个新数组,返回更改后的产品:

function()
  var products = 
  [
    
      name: "Hand Gesture Candle, Shaka  Green",
      id: "21834",
      price: "39.900000",
      brand: "Candlehand",
      category: "Candles"
    
  ];
  
  var changes = [];
  products.forEach(function(obj) 
    var product = 
      content_id: obj.id,
      content_name: obj.name,
      price: obj.price,
      brand: obj.brand,
      category: obj.category
    ;
    changes.push(product);
  );
  return changes;

我在另一个答案中的错误是使用let。我们应该改用var,因为let 是最近才出现的。

对于未来,请在 SO 阅读how much research is expected of you。期望是您不要尝试一次,失败并立即去询问。您知道您必须学习 JavaScript,因此请查看教程和文档。 初学者的问题很好,但你必须证明你已经完成了自己的工作才能达到这一点。

请参阅下面的上述代码的快速演示(添加了console.log() 调用)。

(function()
  var products = 
  [
    
      name: "Hand Gesture Candle, Shaka  Green",
      id: "21834",
      price: "39.900000",
      brand: "Candlehand",
      category: "Candles"
    
  ]
  ;
  var changes = [];
  products.forEach(function(obj) 
    var product = 
      content_id: obj.id,
      content_name: obj.name,
      price: obj.price,
      brand: obj.brand,
      category: obj.category
    ;
    console.log(product);
    changes.push(product);
  );
  return changes;
)();

【讨论】:

这太棒了彼得,而且效果很好。我已经接受了答案,但缺乏支持的声誉。看到您的代码,我可以理解嵌套变量、对象和推送发生了什么,以便能够为未来的用例重新创建类似的东西。对于我的水平来说,我太雄心勃勃了,以至于我认为我已经接近于把这样的东西放在一起了。我确实花了 20 多个小时进行研究和测试,并且了解缺少什么但缺乏执行的基础知识。也不想用我尝试过的东西创建一堵文字墙,我知道我发布的第一个示例是非常错误的。丹克! 没问题,不客气!【参考方案2】:

写一个新数组

str.replace 是字符串的replace 函数,而不是数组。在这里,您正在处理数组中的对象。 你不能只是猜测一个可以工作的功能,然后在这里问一个问题。请查看文档并查找 JavaScript 教程如何使用字符串、对象和数组。 该文档已经包含您可以从中学习的示例。

以下是 JavaScript 文档的一些链接:

MDN: JavaScript String MDN: JavaScript Array MDN: JavaScript Object

一个易于理解的解决方案是创建一个新数组。 循环遍历数组中的每个对象和对象中的每个属性,然后从中创建一个新对象。没有必要花哨。如果需要,只需使用一两个循环即可。 请参阅下面的工作 sn-p。

示例代码

let arr = [
  
    id: "JBLANC015",
    name: "Blanc Diffuser, Maldivian Breeze",
    category: "Diffusers",
    price: "29.90",
    quantity: "3"
  ,
  
    id: "CH-AH-SHK-GREEN",
    name: "Hand Gesture Candle, Shaka  Green",
    category: "Candles",
    price: "39.90",
    quantity: "1"
  
];

let trackingArray = [];
for(var i=0; i<arr.length; i++) 
  let obj = ;
  for(var k in arr[i]) 
    switch(k) 
      case "id":
        obj.content_id = arr[i][k];
        break;
      case "name":
        obj.content_name = arr[i][k];
        break;
      default:
        obj[k] = arr[i][k];
        break;
    
  
  
  console.log(obj);
  trackingArray.push(obj);

【讨论】:

谢谢彼得,不幸的是,在使用此代码时,我在 GTM 中收到错误“第 2 行字符 1 错误:此语言功能仅支持 ECMASCRIPT_2015 模式或更高模式”。关于 GTM 中使用的引擎的一些东西,我认为这也是为什么在 stackoverlfow 上发现的大量类似问题的建议对我不起作用的原因。我用一个接近我所寻求的例子来更新我的问题,这反映了我对同时学习的字符串和数组之间的区别的更好理解。我不是开发人员,而是营销人员,请放轻松。 哦,这是一个面向开发人员的网站,我们当然假设这里有同行。感谢您发布您的代码。我会尝试一个新的答案。

以上是关于如何在 GTM 中使用 javascript 替换 dataLayer 中的参数名称的主要内容,如果未能解决你的问题,请参考以下文章

从 GTM 脚本中减少未使用的 JavaScript

javascript 使用GTM的客户端Javascript错误跟踪(谷歌分析)

javascript 使用jQuery的GTM分析框架(事件委托,自定义事件)

javascript GTM事件跟踪

javascript 网络N - pcgamesn.com - GTM'自定义Javascript'变量

javascript 网络N - pockettactics.com - GTM'自定义Javascript'变量