自上一篇文章以来,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;
}