显示带有标签的帖子 广告 words脚本. 显示所有帖子
显示带有标签的帖子 广告 words脚本. 显示所有帖子

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

2012年11月29日,星期四

使用AdWords脚本自动执行维护任务,第1部分

我不觉得丢脸。 我读过《傻瓜》。 我最喜欢的之一是 AdWords for Dummies. 说出您想要这些书的内容,但它们易于阅读,并且具有快速入门的重要信息。

本书中的一章介绍了 每月维护您的AdWords帐户的程序.  使用AdWords脚本是自动执行这些任务的好方法。 让我们从本月的第一天开始。

“在每月的第一天,处理所有转换成本过高的关键字。”


听起来很简单。 当然,您需要为所有这些设置转换跟踪。他们说拉过去的30天,这是我们在这里所做的,但是您可以拉任何喜欢的时间范围。 这是本书中的示例。 您当然应该用对您的业务有意义的值替换顶部的值。

//-----------------------------------
// Reduce Bids on High Cost per Conversion Keywords
// Created By: 拉斯 Savage
// FreeAdWordsScripts.com
//-----------------------------------
function main() {
  //Let's reduce 关键字 with a CPC greater than $15 by 35%
  var WAY_TOO_HIGH_COST_PER_CONV = 15;
  var WAY_TOO_HIGH_BID_REDUCTION_AMOUNT = .35;
  
  //And 关键字 with CPC between $10 and $15 by 20%
  var TOO_HIGH_COST_PER_CONV = 10;
  var TOO_HIGH_BID_REDUCTION_AMOUNT = .20;
  
  var kw_iter = AdWordsApp.keywords()
    .withCondition("Status = ENABLED")
    .get();
  
  while(kw_iter.hasNext()) {
    var kw = kw_iter.next();
    var kw_stats = kw.getStatsFor("LAST_30_DAYS");
    var cost = kw_stats.getCost();
    var 转换 = kw_stats.getConversions();
    if(conversions > 0) {
      var cost_per_conversion = (cost/(conversions*1.0));
      //Here is the magic.  If it is way too high, reduce it by the way too high amount
      if(cost_per_conversion >= WAY_TOO_HIGH_COST_PER_CONV) {
        kw.setMaxCpc(kw.getMaxCpc() * (1-WAY_TOO_HIGH_BID_REDUCTION_AMOUNT)); 
      }
      //otherwise, if it is still too high, reduce it with just the too high amount
      else if(cost_per_conversion >= TOO_HIGH_COST_PER_CONV) {
        kw.setMaxCpc(kw.getMaxCpc() * (1-TOO_HIGH_BID_REDUCTION_AMOUNT));
      }
    }else{
      //no 转换 on this 关键词
      //we will deal with that later
      continue;
    }
  }
}
就是这样。请继续关注下一期,我们将通过提高出价来解决效果好的关键字。

谢谢,
拉斯

2012年11月28日,星期三

使用这些脚本入门

就像电影在该功能上播放了十五分钟的首映电影一样,今天,我将讨论如何实际使用此网站上发布的脚本。 可以将其视为使用此博客中提供的信息的入门指南。

这里的大多数信息来自于 开发人员文件 用于AdWords脚本,可以找到 这里.

我实际上如何到达输入脚本的地方?

我发现到达这些脚本输入位置的最简单方法是选择“创建和管理脚本>>广告系列标签上“自动”按钮中的“”选项。
这将使您进入一个允许您创建新脚本的页面。

创建新脚本后,您应该能够将此Blog上的任何脚本直接复制到文本框中(删除其中的内容供初学者使用)。
Google具有强大的功能,可让您预览脚本的结果,然后在帐户上实际运行它。 为了使任何内容都能运行,您必须“授权”脚本访问您的帐户。 只需单击“立即授权”按钮,然后按照提示进行操作即可。

预览脚本后,您可以对其命名,保存并在您的帐户上运行它。 只需单击脚本页面上的“创建时间表”链接,即可安排它的运行。

那里有。 让我知道您是否对设置帖子发表评论有什么麻烦。 如果您遇到麻烦,也可能还会有人。

谢谢,
拉斯