0

我有一个插入 Google Analytics 自定义维度的脚本。这对于我想将自定义维度复制到的新 GA 属性很有用。如果目标属性中存在现有的自定义维度,它将附加。

因此,我想使用

Analytics.Management.CustomDimensions.update() 

function updateCustomDims() {
  var sourceProperty = 'UA-XXXXXXXX-1' 
  var sourceAccount = 'XXXXXXXX'
  var sourceDimensions =             Analytics.Management.CustomDimensions.list(sourceAccount, sourceProperty)
  var sourceItems = sourceDimensions['items']
  var destinationProperty = 'UA-XXXXXXXX-1'
  var destinationAccount = 'XXXXXXXX' 
  var destinationDimensions =     Analytics.Management.CustomDimensions.list(destinationAccount, destinationProperty)  
  var destinationItems = destinationDimensions['items']
  for (var i = 0; i < sourceItems.length; i++) {
    var sourceContent = {
      'name': sourceItems[i]['name'],
      'scope': sourceItems[i]['scope'],
      'active': sourceItems[i]['active']
    }

    for (var i = 0; i < destinationItems.length; i++) {
      var destinationContent = {
        'name': destinationItems[i]['name'],
        'scope': destinationItems[i]['scope'],
        'active': destinationItems[i]['active']
      }
      var cdId = {'id': destinationItems[i]['id']}     

      if (destinationContent[i] != undefined) {
        Analytics.Management.CustomDimensions.update(sourceContent, destinationAccount, destinationProperty, cdId)
      } else {
        Analytics.Management.CustomDimensions.insert(sourceContent, destinationAccount, destinationProperty)
      }
      Utilities.sleep(1000) 
    }
  }
}

即使存在现有的自定义维度,它也只会追加。它应该更新现有维度。

供参考:https ://developers.google.com/resources/api-libraries/documentation/analytics/v3/java/latest/com/google/api/services/analytics/Analytics.Management.CustomDimensions.Update.html

4

1 回答 1

1

可能您的问题是您正在使用整数键而不是键名访问对象:destinationContent[i]变为destinationContent[0],destinationContent[1]等。但是您显然已经定义destinationContent为只有键name,scopeactive. 您还可以双重使用迭代器变量i,这肯定会使您的脚本表现得非常混乱。

请注意,正确的 API 参考链接是此处的底层 REST API 资源

假设您要检查目标中是否已存在特定的源维度,如果存在,请更新它(而不是插入它),您可能需要执行以下操作:

// Create an associative map between the name of a custom dimension
// and its ID (rather than search an array repeatedly).
const existingDims = destinationItems.reduce(function (acc, item) {
  var name = item.name;
  acc[name] = item.id;
  return acc;
}, {});

sourceItems.forEach(function (sourceItem) {
  // Construct the resource for this source item.
  var name = sourceItem.name;
  var sourceContent = {
    name: name,
    scope: sourceItem['scope'],
    active: sourceItem['active']
  };

  // Does this resource exist already?
  var existingId = existingDims[name];
  if (existingId)
    // update
  else
    // insert
});

参考文献

于 2019-01-08T17:54:08.223 回答