显示带有标签的帖子 擅长. 显示所有帖子
显示带有标签的帖子 擅长. 显示所有帖子

2013年10月20日,星期日

使用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;
}