有机会利用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; }