显示带有标签的帖子 谷歌驱动器. 显示所有帖子
显示带有标签的帖子 谷歌驱动器. 显示所有帖子

2013年10月20日,星期日

使用GDrive将单个AdWords脚本加载到多个帐户中

使用AdWords脚本的缺点之一是您需要登录每个帐户并设置脚本。对于大多数人来说,这在头几次都不是问题。但是,当您开始看到其中一些脚本的价值时,可能需要将一组脚本放入所有帐户中。设置它们很好,直到您发现代码中的错误并且必须进入并更新每个帐户中脚本的所有20个副本为止。

在本文中,我整理了一种简单的方法来保留脚本的单个副本并将其加载到任意数量的AdWords帐户中。然后,如果您要进行更改,则可以更新脚本的单个版本,所有帐户将立即开始使用新代码。

此代码包含两部分。代码的第一段是您需要放置在每个帐户中的通用代码。这段代码引用了一个Google电子表格(以下是一个示例供您复制: http://goo.gl/y6hPfy),它用于了解应该运行哪些脚本。电子表格只有3列:仅用于记录的描述,脚本在Google云端硬盘中的位置以及脚本中的对象名称。现在不用担心,我将在下一部分中对其进行更好的描述。最后,它加载脚本文件并执行main函数。

/************************************
 * Generic Script Runner
 * Version 1.0
 * Created By:  拉斯  Savage
 * FreeAdWordsScripts.com
 ***********************************/
function main() {
  //See http://goo.gl/KvINmD for an example 电子表格.
  var scriptConfigId = 'Your Spreadsheet Id Goes Here';
  var sheet = SpreadsheetApp.openById(scriptConfigId).getActiveSheet();
  var data = sheet.getRange('A:C').getValues();
  for(var i in data) {
    if(i == 0) { continue; }
    var [description, location, classname] = data[i];
    if(!location) { continue; }
    Logger.log('Running "'+description+'" from location: '+location);
    var scriptFile = getFile(location);
    var scriptText = scriptFile.getBlob().getDataAsString();
    eval(scriptText);
    var script = eval('new '+classname+'();');
    script.main();
  }
}
 
//This function gets the file from GDrive
function getFile(loc) {
  var locArray = loc.split('/');
  var folder = getFolder(loc);
  if(folder.getFilesByName(locArray[locArray.length-1]).hasNext()) {
    return folder.getFilesByName(locArray[locArray.length-1]).next();
  } else {
    return null;
  }
}
 
//This function finds the folder for the file and  创造 s folders if needed
function getFolder(folderPath) {
  var folder = DriveApp.getRootFolder();
  if(folderPath) {
    var pathArray = folderPath.split('/');
    for(var i in pathArray) {
      if(i == pathArray.length - 1) { break; }
      var folderName = pathArray[i];
      if(folder.getFoldersByName(folderName).hasNext()) {
        folder = folder.getFoldersByName(folderName).next();
      }
    }
  }
  return folder;
}

现在,我们已经有了一段通用的代码,可以从电子表格中读取描述,位置和对象名称并执行代码,我们需要对一些现有脚本进行一些小的修改才能使其正常工作。

我最喜欢的脚本之一是关于 在您的帐户中查找异常。为了从另一个脚本运行该脚本,我们需要使用单个公共函数将其转换为对象。相同的技术应该适用于几乎所有的脚本 FreeAdWordsScripts.com.

首先,将整个脚本包含在一个函数调用中,并根据需要命名。
function Anomalies() {
 // Copy and Paste the code from:
 // http://goo.gl/IT1UcV
};
接下来,您需要将main函数更新为公共方法,以便我们可以从通用脚本中调用它。
this.main = function() {
 // Don't make any changes to the body of the main method
}

完整版本的更新代码可以在这里找到: 在您的帐户对象版本中查找异常.

现在,您可以将此新脚本保存在GDrive中的某个位置,并在配置电子表格中更新位置和对象名称(在这种情况下为异常)。

现在您应该很好了。您可以在配置电子表格中添加任意数量的脚本,但请记住,30分钟的限制仍然适用。

谢谢,
拉斯

使用Excel管理您的AdWords广告

自上一篇文章以来,Google一直在忙于发布AdWords脚本的大量新功能。 其中之一就是可以直接与您的Google云端硬盘文件进行交互的功能。 这之所以令人赞叹,有几个原因,其中一个原因是,它使您可以通过电子表格管理您的帐户,这些电子表格会每小时自动同步回您的Google AdWords帐户。

有机会利用Excel电子表格的功能来创建关键字,管理广告,广告组或广告附加信息。还是不服气?您还可以每天将所有帐户指标自动发送到Google云端硬盘,并自动下载到计算机上。

因此,我想我将演示如何使用此新功能来管理广告。

您需要做的第一件事是 将Google云端硬盘安装到您的计算机上。这很容易做到,但确实需要计算机的管理员权限。 如果您现在无法安装,则无需担心。 您可以通过浏览器更新Google云端硬盘中的文件来管理站点链接。

现在看下面的脚本。您应该设置一些配置选项。 FOLDER_PATH 是要在其中存储这些文件的文件夹的路径。 例如,“ AdWords /广告素材”。如果文件夹路径不存在,此脚本将为您创建它。

下一个参数是FILE_NAME,它将是广告素材数据将存储在其中的文件。在此示例中,该文件必须写为.CSV。 Google使得使用解析CSV文件非常容易 Utilities.parseCsv函数.

使用此脚本,您可以使用Excel从csv文件中更改标题,说明,URL,状态和设备首选项。 然后,只需将文件保存回Google云端硬盘,下一次脚本运行(每天或每小时),您的更改就会反映出来。

通过Excel而不是通过某些UI可以更容易地管理AdWords的哪些其他功能?

谢谢,
拉斯

/******************************************
 * Manage AdWords Ads Using Excel
 * Version 1.0
 * Author:  拉斯  Savage
 * FreeAdWordsScripts.com
 ****************************************/
var FOLDER_PATH = 'AdWordsData'; //The path where the file will be stored on GDrive
var FILE_NAME = 'creatives.csv'; //The name of the file on GDrive
 
var INCLUDE_STATS = true; // Set to false to  去掉   统计资料  from the file
var DATE_RANGE = 'LAST_30_DAYS'; //The date range for the  统计资料 
 
var INCLUDE_PAUSED_ADS = true; //Set to false to only report on active  广告 
var DELETE_ORIGINAL_ADS = true; //When set to false, the original  广告  will be  暂停 d instead of  删除 d
 
function main() {
  var file = getFile(FILE_NAME,FOLDER_PATH);
  if(!file) {
    file =  创造 NewFile(FILE_NAME,FOLDER_PATH,buildCreativesFile());
    return;
  }
  
  var fileContent = file.getBlob().getDataAsString();
  var  广告素材  = {};
  if(fileContent) {
     广告素材  = parseFileContent(fileContent);
  }
  
  var creativeIter = getAdIterator();
  while(creativeIter.hasNext()) {
    var creative = creativeIter.next();
    var  广告 Id = creative.getId();
    if(creatives[adId]) {
      //ok we found the  广告 .
      //Checking status
      var isEnabledFile = (creatives[adId]['Status'] === 'Enabled');
      if(creative.isEnabled() != isEnabledFile) {
        if(isEnabledFile) { 
          creative.enable(); 
        } else { 
          creative.pause(); 
        }
      }
      
      if(hadAdChanged(creative,creatives[adId])) {
        if(DELETE_ORIGINAL_ADS) {
          creative.remove();
        } else {
          creative.pause();
        }
         创造 NewAd(creative.getAdGroup(),creatives[creative.getId()]);
      }
    }
  }
  file.setContent(buildCreativesFile());
}
 
//Helper function to  创造  a new  广告 
function  创造 NewAd(ag,newAd) {
  var optArgs = {
    isMobilePreferred: (newAd['Device'] === 'Mobile') ? true : false
  };
  ag.createTextAd(newAd['Headline'],newAd['Desc1'],newAd['Desc2'],newAd['DisplayUrl'],newAd['DestinationUrl'],optArgs);
}
 
//This checks to see if the  广告  has been changed
function hadAdChanged(ad,oldAd) {
  var newAdText = [ad.getHeadline(),
                    广告 .getDescription1(),
                    广告 .getDescription2(),
                    广告 .getDisplayUrl(),
                    广告 .getDestinationUrl(),
                   (ad.isMobilePreferred()) ? 'Mobile' : 'Desktop'].join('~~!~~');
  var oldAdText = [oldAd['Headline'],
                   oldAd['Desc1'],
                   oldAd['Desc2'],
                   oldAd['DisplayUrl'],
                   oldAd['DestinationUrl'],
                   oldAd['Device']].join('~~!~~');
  Logger.log(newAdText);
  Logger.log(oldAdText);
  return (newAdText !== oldAdText);
}
 
//This builds the  广告素材  file from all the  广告  in the account.
function buildCreativesFile() {
  var report = getReportColumns();
  var creativeIter = getAdIterator();
  while(creativeIter.hasNext()) {
    var creative = creativeIter.next();
    report += getReportRow(creative);
  }
  return report;
}
 
//This returns the  广告  iterator based on options.
function getAdIterator() {
  var  广告 Selector = AdWordsApp.ads().withCondition("Type = 'TEXT_AD'"); 
  if(!INCLUDE_PAUSED_ADS) {
     广告 Selector =  广告 Selector.withCondition('CampaignStatus = ENABLED')
                           .withCondition('AdGroupStatus = ENABLED')
                           .withCondition('Status = ENABLED');
  }
  return  广告 Selector.get();
}
 
//This returns a CSV fow for the report.
function getReportRow(ad) {
  var retVal = [
     广告 .getId(),
     广告 .getCampaign().getName(),(ad.getCampaign().isPaused()) ? 'Paused' : 'Enabled',
     广告 .getAdGroup().getName(),(ad.getAdGroup().isPaused()) ? 'Paused' : 'Enabled',
     广告 .getHeadline(),
     广告 .getDescription1(),
     广告 .getDescription2(),
     广告 .getDisplayUrl(),
     广告 .getDestinationUrl(),
    (ad.isPaused()) ? 'Paused' : 'Enabled',
    (ad.isMobilePreferred()) ? 'Mobile' : 'Desktop',
  ];
  if(INCLUDE_STATS) {
    var  统计资料  =  广告 .getStatsFor(DATE_RANGE);
    retVal = retVal.concat([
       统计资料 .getImpressions(),
       统计资料 .getClicks(),
       统计资料 .getCtr(),
       统计资料 .getCost(),
       统计资料 .getAverageCpc(),
       统计资料 .getConversions(),
       统计资料 .getConversionRate(),
       统计资料 .getAveragePageviews(),
       统计资料 .getAveragePosition(),
       统计资料 .getAverageTimeOnSite(),
       统计资料 .getBounceRate()
      ]);
  }
  return '"' + retVal.join('","') + '"\n';
}
 
//This returns the column headings used for the report.
function getReportColumns() {
  var columnHeadings = [
    'AdId',
    'CampaignName','CampaignStatus',
    'AdGroupName','AdGroupStatus',
    'Headline',
    'Desc1',
    'Desc2',
    'DisplayUrl',
    'DestinationUrl',
    'Status',
    'Device'];
  if(INCLUDE_STATS) {
    columnHeadings = columnHeadings.concat([
      'Impressions',
      'Clicks',
      'Ctr',
      'Cost',
      'Cpc',
      'Conversions',
      'ConversionRate',
      'AveragePageviews',
      'AvgPosition',
      'AvgTimeOnSite',
      'BounceRate'
      ]);
  }
  return '"' + columnHeadings.join('","') + '"\n';
}   
 
//This function parses the  广告素材  file into an object for processing
function parseFileContent(fileContent) {
  var headers = [];
  var idHash = {};
  var data = Utilities.parseCsv(fileContent);
  for(var i in data) {
    var cells = data[i]
    if(cells.length == 1) { continue; } //skip any empty rows
    if(i == 0) { 
      headers = cells; 
    } else {
      var rowMap = {};
      for(var x in headers) {
        headers[x] = headers[x];
        cells[x] = cells[x];
        rowMap[headers[x]] = cells[x];
      }
      idHash[rowMap['AdId']] = rowMap;
    }
  }
  return idHash;
}
 
//This function gets the file from GDrive
function getFile(fileName,folderPath) {
  var folder = getFolder(folderPath);
  if(folder.getFilesByName(fileName).hasNext()) {
    return folder.getFilesByName(fileName).next();
  } else {
    return null;
  }
}
 
//This function  创造 s a new file on GDrive
function  创造 NewFile(fileName,folderPath,content) {
  if(!fileName) { throw 'createNewFile: Missing filename.'; }
  var folder = getFolder(folderPath);
  
  return folder.createFile(fileName, content);
}
 
//This function finds the folder for the file and  创造 s folders if needed
function getFolder(folderPath) {
  var folder = DriveApp.getRootFolder();
  if(folderPath) {
    var pathArray = folderPath.split('/');
    for(var i in pathArray) {
      var folderName = pathArray[i];
      if(folder.getFoldersByName(folderName).hasNext()) {
        folder = folder.getFoldersByName(folderName).next();
      } else {
        folder = folder.createFolder(folderName);
      }
    }
  }
  return folder;
}