繁体   English   中英

谷歌标签管理器模板仅读取数组的第一个元素以获取超过 1 个项目的事件

[英]google tag manager template only reading first elements of array for events with more than 1 item

我正在实现这个谷歌标签管理器模板(GA3/UA),但问题是当有多个产品时,它只捕获或读取 arrays 的第一个元素,这发生在所有可能有超过1 产品,我对此有点陌生,谁能指导我为什么会发生这种情况? 这是沙箱 javascript 的代码,我只需要获取 arrays 的所有元素,而不是第一个,其他一切正常。 非常感谢您提前。

___SANDBOXED_JS_FOR_WEB_TEMPLATE___

const log = require('logToConsole');
const makeTableMap = require('makeTableMap');
// Call APIs to set dataLayer and copy values from dataLayer
const copyFromDataLayer = require('copyFromDataLayer');
// Set the function where we want to push the dataLayer
const createQueue = require('createQueue');
const dataLayerPush = createQueue('dataLayer');

//Validate structure
var ecommerce_data = copyFromDataLayer('ecommerce.'+data.activity);
if(ecommerce_data == undefined){
  //dataLayerPush({'event': "error", "info": "enhanced ecommerce base structure not found for "+ data.activity});
 // return;
  ecommerce_data = {};
}
var ecommerce_actionField = copyFromDataLayer('ecommerce.'+data.activity+".actionField");
if(ecommerce_actionField == undefined){ ecommerce_actionField = {};}
var ecommerce_products = copyFromDataLayer('ecommerce.'+data.activity+".products");
if(ecommerce_products == undefined){ecommerce_products = []; ecommerce_products.push({});}
var ecommerce_impressions = copyFromDataLayer('ecommerce.'+data.activity);
if(ecommerce_impressions == undefined){ecommerce_impressions = []; ecommerce_impressions.push({});}
var ecommerce_promotions = copyFromDataLayer('ecommerce.'+data.activity+".promotions");
if(ecommerce_promotions == undefined){ecommerce_promotions = []; ecommerce_promotions.push({});}


//this fucntion works only for one element edition. 
//Usable for: actionFiel, product click, detail, add, remove, promotionClick
//Params: aField, ecommerce_origin
function merge_element() {
  log("entro 1");
  let key;
  for (key in arguments[0]) {
      arguments[1][key] = arguments[0][key];
    }
  return arguments[1];
}
//this fucntion works for a list of elements edition. 
//Usable for: products, impressions and promotions
//Params: prods, ecommerce_origin, type_index
function merge_elements(){
  if(arguments[2] == "all"){
    let key, elem;
    for(elem in arguments[1]){
       for (key in arguments[0]) {
         arguments[1][elem][key] = arguments[0][key];
        }
    }
  }else{
    var indexes = data.index.split(",");
    log("indexes", indexes);
    let elem, key;
    for(elem in indexes){
      if(!arguments[1].hasOwnProperty(indexes[elem]-1)){
        log(indexes[elem] + " is not a number or not beyong your array size");
        continue;
      }
      for (key in arguments[0]) {
         arguments[1][indexes[elem]-1][key] =arguments[0][key];
        }
    } 
  }
  return arguments[1];
}

var aField = {}, prods = {}, impr = {},prom ={};
if(data.actionField != undefined){aField = makeTableMap(data.actionField, 'key', 'value');}
if(data.products != undefined){prods = makeTableMap(data.products, 'key', 'value');}
if(data.impressions != undefined){impr = makeTableMap(data.impressions, 'key', 'value');}
if(data.promotions != undefined){prom = makeTableMap(data.promotions, 'key', 'value');}
var type_index = "all";
if(data.type_index != undefined){type_index = data.type_index;}
const datalayer = {};
datalayer[data.activity] ={};

datalayer.currencyCode = copyFromDataLayer('ecommerce.currencyCode') != undefined? copyFromDataLayer('ecommerce.currencyCode'): data.currencyCode;


if(data.activity == "checkout"||data.activity =="click"||data.activity =="detail"|| data.activity == "purchase"){
  log("entro click");
    datalayer[data.activity].actionField = merge_element(aField, ecommerce_actionField);
    datalayer[data.activity].products = merge_elements(prods, ecommerce_products, type_index);
}

if(data.activity == "add"||data.activity == "remove"){
    datalayer[data.activity].products = merge_elements(prods, ecommerce_products, type_index);
}
if(data.activity == "promoView"|| data.activity == "promoClick"){
    datalayer[data.activity].promotions = merge_elements(prom, ecommerce_promotions, type_index);
}
if(data.activity == "impressions"){
    datalayer[data.activity].impressions = merge_elements(impr, ecommerce_impressions, type_index);
}

//basic data recompilation
var event = "", eventCategory = "",eventAction = "",eventLabel = "",eventValue = 0;
if(data.basic_data){
  event = data.event_name +"";
  eventCategory = data.event_category+"";
  eventAction = data.event_action+"";
  eventLabel = data.event_label+"";
  eventValue = data.event_value+"";
}
if(event == ""){
  event = copyFromDataLayer('event')+ "_changed";
}if(eventCategory == ""){
  eventCategory = copyFromDataLayer('eventCategory') != null? copyFromDataLayer('eventCategory'): "Enhanced ecommerce";
}if(eventAction == ""){
  eventAction = copyFromDataLayer('eventAction') != null? copyFromDataLayer('eventAction'): data.activity;
  
}if(eventLabel == ""){
  if(copyFromDataLayer('eventLabel') != null){
    eventLabel= copyFromDataLayer('eventLabel');
  }else{
    if(data.activity == "impressions"){
      eventLabel = datalayer[data.activity].impressions[0].name;
    }
    if(data.activity == "promoView"|| data.activity == "promoClick"){
    eventLabel = datalayer[data.activity].promotions[0].name;
    }else{
      eventLabel=datalayer[data.activity].products[0].name;
    }
  }
}if(eventValue == 0){
    if(copyFromDataLayer('eventValue') != null){
      eventValue = copyFromDataLayer('eventValue');
    }
  }

dataLayerPush({'event': event,'eventCategory': eventCategory, 'eventAction': eventAction, 'eventLabel': eventLabel, 'eventValue': eventValue,'ecommerce':datalayer});

data.gtmOnSuccess();

您可以在模板单元测试中模拟 DL 值。

正确模拟它,运行测试,调试值。 如果这还不足以使问题变得明显,请发布您的尝试的mcve

不要只是将整个模板转储到一个问题中。 显示您的调试尝试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM