显示带有标签的帖子 关键字. 显示所有帖子
显示带有标签的帖子 关键字. 显示所有帖子

2013年7月11日,星期四

在Google电子表格中的广告组一级设置AdParams

我有几个人问我如何更新以前的辽宁福利彩票中心 在关键字级别设置AdParams 以便可以在广告组一级进行设置。这是该辽宁福利彩票中心的更新,仅此即可。

要使用它,您需要 创建一个新的Google电子表格 并分别在A,B和C列(带有列标题)中分别加载广告组名称,参数1值和参数2值。然后将该URL复制到辽宁福利彩票中心中,您应该一切顺利。

谢谢,
拉斯

/************************************************
* Update Ad Params by Ad Groups
* Version 1.1
* ChangeLog v1.1
*  - Added the ability to enable param1 or 2 individually
*  - Looks for Keywords on all sheets
*  - Runs much faster
* Created By:  拉斯  Savage
* FreeAdWordsScripts.com
************************************************/
var SPREADSHEET_URL = "PUT YOUR SPREADSHEET URL HERE";
var SET_PARAM1 = true;
var SET_PARAM2 = false;
var DATA_RANGE = 'A:D'; // A - CampaignName, B - AdGroupName, 
                        // C - Param1, D - Param2

function main() {
  var 电子表格 = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var allSheets = 电子表格.getSheets();
  var allData = [];
  for(var i in allSheets) {
    var sheet = allSheets[i];
    var data = sheet.getRange(DATA_RANGE).getValues();
    data.shift(); //get rid of headers
    allData = allData.concat(data);
  }
  
  var allDataHash = {};
  for(var i in allData) {
    var row = allData[i];
    if(row[0] === '') { continue; }
    var rowKey = [row[0],row[1]].join('~~!~~');
    allDataHash[rowKey] = { param1 : row[2], param2: row[3] };
  }
  
  var kwIter = AdWordsApp.keywords()
    .withCondition('CampaignStatus = ENABLED')
    .withCondition('AdGroupStatus = ENABLED')
    .withCondition('Status = ENABLED')
    .get();
  
  while(kwIter.hasNext()) { 
    var kw = kwIter.next();
    var campName = kw.getCampaign().getName();
    var  广告 GroupName = kw.getAdGroup().getName();
    var rowKey = [campName,adGroupName].join('~~!~~');
    if(allDataHash[rowKey]) {
      if(SET_PARAM1) { kw.setAdParam(1, allDataHash[rowKey].param1); }
      if(SET_PARAM2) { kw.setAdParam(2, allDataHash[rowKey].param2); }
    }
  }
}

2013年6月17日,星期一

查找关键字,广告组和广告中的异常

2013年7月23日更新:添加了向广告添加标签的功能。这可能对创意测试很有帮助。

在一个 最近来自SearchEngineLand的帖子,拉里·金(Larry Kim)希望PPC经理不要再偷懒。除了链接诱饵,他还有一些优点。我认为花费在倾倒客户电子表格上的大部分时间实际上是在试图回答“异常在哪里?”这个简单的问题。

异常是关键字或广告组,其效果似乎与同一个广告组或广告系列中的兄弟姐妹不同。也许您有一个包含15个关键字和一个或两个关键字的广告组,似乎获得了几乎所有的点击。或者,也许您只是拥有一个广告组,似乎正在占用预算的很大一部分,而您想对其进行更多控制。在这两种情况下,您都需要某种方法来快速确定要对哪些关键字或广告组进行操作。

因此,我创建了以下辽宁福利彩票中心来帮助我做到这一点。它内含一些统计信息,可以计算一组实体(广告组或关键字)的均值和标准差。然后,我将标签应用于似乎与均值相差两个标准偏差以上的任何实体,这表明该实体的性能要比其同级产品更好或更差。这样,我可以在自己的帐户中轻松地对这些实体采取措施。

该辽宁福利彩票中心还将每天向您发送一封电子邮件,其中包含它认为是异常的实体的摘要。您的目标是通过将这些问题转移到自己的广告系列和广告组中,或者甚至完全消除它们(可能是负面的)来解决这些问题。

目前,辽宁福利彩票中心将检查AdWordsApp.stats对象中可用的每个指标。可以轻松对其进行修改,以检查诸如每次转化费用或每次展示利润。您将在下面的代码中看到,您可以在其中删除也不感兴趣的统计信息。

需要警告的一点是,我并没有声称自己是统计学家,所以这可能不是一种看待事物的有效方法。希望它可以帮助您快速找到帐户中的问题并加以解决,以便您可以将更多时间花在懒惰上:)

另外,我欢迎您对此辽宁福利彩票中心提出意见和建议。对其他人有用吗?

谢谢,
拉斯

/**************************************
* Find the Anomalies
* Created By:  拉斯  Savage
* Version: 1.2
* Changelog v1.2
*  - Fixed divide by 0  错误 
*  - Changed SIG_FIGS to DECIMAL_PLACES
* Changelog v1.1
*  - Added ability to tag  广告  anomalies as well
* FreeAdWordsScripts.com
**************************************/
var DATE_RANGE = 'LAST_30_DAYS';
var DECIMAL_PLACES = 3;
var STANDARD_DEVIATIONS = 2;
var TO = ['[email protected]_domain.com'];
 
function main() {
  // This will  广告 d  标签  to and send  电子邮件 s about 广告群组, 关键字 and  广告 . Remove any if you like.
  var levels_to_tag = ['adgroup','keyword','ad'];
  for(var x in levels_to_tag) {
    var report = getContentRows(levels_to_tag[x]);
    var  实体 _map = buildEntityMap(levels_to_tag[x]);
    for(var parent_id in  实体 _map) {
      var child_list =  实体 _map[parent_id];
      var  统计资料 _list = Object.keys(child_list[0].stats);
      for(var i in  统计资料 _list) {
        var  意思  = getMean(child_list,stats_list[i]);
        var stand_dev = getStandardDev(child_list,mean,stats_list[i]);
        var  标签 _name =  统计资料 _list[i]+"_anomaly";
        report +=  广告 dLabelToAnomalies(child_list,mean,stand_dev,stats_list[i],label_name,levels_to_tag[x]);
      }
    }
    sendResultsViaEmail(report,levels_to_tag[x]);
  }
}
  
//Takes a report and the level of 报告 and sends and  电子邮件 
//with the report as an  在 tachment.
function sendResultsViaEmail(report,level) {
  var rows = report.match(/\n/g).length - 1;
  if(rows == 0) { return; }
  var options = { 附件: [Utilities.newBlob(report, 'text/csv', level+"_anomalies_"+_getDateString()+'.csv')] };
  var  电子邮件 _body = "There are " + rows + " " + level + "s that have abnormal performance. See  在 tachment for details.";
  var subject = 'Abnormal ' + _initCap(level) + ' Entities Report - ' + _getDateString();
  for(var i in TO) {
    MailApp.sendEmail(TO[i], subject,  电子邮件 _body, options);
  }
}
  
//Helper function to return a single row of the report formatted correctly
function toReportRow(entity,level,label_name) {
  var ret_val = [AdWordsApp.currentAccount().getCustomerId(),
                 entity.getCampaign().getName()];
  ret_val.push( (level == 'adgroup') ?  实体 .getName() :  实体 .getAdGroup().getName() );
  if(level == 'keyword') {
    ret_val = ret_val.concat([entity.getText(),entity.getMatchType()]); 
  } else if(level == 'ad') {
    ret_val = ret_val.concat([entity.getHeadline(),entity.getDescription1(),entity.getDescription2(),entity.getDisplayUrl()]); 
  }
  ret_val.push(label_name);
  return '"' + ret_val.join('","') + '"\n';
}
  
//Helper function to return the column headings for the report
function getContentRows(level) {
  var ret_val = ['AccountId','CampaignName','AdGroupName'];
  if(level == 'keyword') {
    ret_val = ret_val.concat(['KeywordText','MatchType']); 
  } else if(level == 'ad') {
    ret_val = ret_val.concat(['Headline','Description1','Description2','DisplayUrl']);
  }
  ret_val.push('LabelName');
  return '"' + ret_val.join('","') + '"\n';
}
  
//Function to  广告 d the  标签  to the entities based on the 标准偏差 and  意思 .
//It returns a  CSV  formatted string for 报告
function  广告 dLabelToAnomalies(entites,mean,sd,stat_key,label_name,level) {
  createLabelIfNeeded(label_name);
  var report = '';
  for(var i in entites) {
    var  实体  = entites[i]['entity'];
    var deviation = Math.abs(entites[i]['stats'][stat_key] -  意思 );
    if(sd != 0 && deviation/sd >= STANDARD_DEVIATIONS) {
      entity.applyLabel(label_name);
      report += toReportRow(entity,level,label_name);
    } else {
      entity.removeLabel(label_name);
    }
  }
  return report;
}
  
//This is a helper function to  创造  the  标签  if it does not already exist
function  创造 LabelIfNeeded(name) {
  if(!AdWordsApp.labels().withCondition("Name = '"+name+"'").get().hasNext()) {
    AdWordsApp.createLabel(name);
  }
}
  
//This function returns the 标准偏差 for a set of entities
//The stat key determines which stat to calculate it for
function getStandardDev(entites,mean,stat_key) {
  var total = 0;
  for(var i in entites) {
    total += Math.pow(entites[i]['stats'][stat_key] -  意思 ,2);
  }
  if(Math.sqrt(entites.length-1) == 0) {
    return 0;
  }
  return round(Math.sqrt(total)/Math.sqrt(entites.length-1));
}
  
//Returns the  意思  (average) for the set of entities
//Again, stat key determines which stat to calculate this for
function getMean(entites,stat_key) {
  var total = 0;
  for(var i in entites) {
    total += entites[i]['stats'][stat_key];
  }
  if(entites.length == 0) {
    return 0;
  }
  return round(total/entites.length);
}
  
//This function returns a map of the entities that I am processing.
//The format for the map can be found on the first line.
//It is  意思 t to work on AdGroups and Keywords
function buildEntityMap(entity_type) {
  var map = {}; // { parent_id : [ {  实体  :  实体 ,  统计资料  :  实体 _stats } ], ... }
  var iter = getIterator(entity_type);
  while(iter.hasNext()) {
    var  实体  = iter.next();
    var  统计资料  =  实体 .getStatsFor(DATE_RANGE);
    var  统计资料 _map = getStatsMap(stats);
    var parent_id = getParentId(entity_type,entity);
    if(map[parent_id]) { 
      map[parent_id].push({entity :  实体 ,  统计资料  :  统计资料 _map});
    } else {
      map[parent_id] = [{entity :  实体 ,  统计资料  :  统计资料 _map}];
    }
  }
  return map;
}
  
//Given an  实体  type (adgroup or  关键词 ) this will return the parent id
function getParentId(entity_type,entity) {
  switch(entity_type) {
    case 'adgroup' :
      return  实体 .getCampaign().getId();
    case 'keyword':
      return  实体 .getAdGroup().getId();
    case 'ad':
      return  实体 .getAdGroup().getId();
  }
}
  
//Given an  实体  type this will return the iterator for that.
function getIterator(entity_type) {
  switch(entity_type) {
    case 'adgroup' :
      return AdWordsApp.adGroups().forDateRange(DATE_RANGE).withCondition("Impressions > 0").get();
    case 'keyword' :
      return AdWordsApp.keywords().forDateRange(DATE_RANGE).withCondition("Impressions > 0").get();
    case 'ad' :
      return AdWordsApp.ads().forDateRange(DATE_RANGE).withCondition("Impressions > 0").get();
  }
}
  
//This returns a map of all the  统计资料  for a given  实体 .
//You can  评论  out the things you don't really care about.
function getStatsMap(stats) {
  return { // You can  评论  these out as needed.
          avg_cpc :  统计资料 .getAverageCpc(),
          avg_cpm :  统计资料 .getAverageCpm(),
          avg_pv :  统计资料 .getAveragePageviews(),
          avg_pos :  统计资料 .getAveragePosition(),
          avg_tos :  统计资料 .getAverageTimeOnSite(),
          bounce :  统计资料 .getBounceRate(),
          clicks :  统计资料 .getClicks(),
          cv :  统计资料 .getConversionRate(),
          conv :  统计资料 .getConversions(),
          cost :  统计资料 .getCost(),
          ctr :  统计资料 .getCtr(),
          imps :  统计资料 .getImpressions()
         };
}
  
//Helper function to format todays date
function _getDateString() {
  return Utilities.formatDate((new Date()), AdWordsApp.currentAccount().getTimeZone(), "yyyy-MM-dd");
}
  
//Helper function to capitalize the first letter of a string.
function _initCap(str) {
  return str.replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); });
}

// A helper function to make rounding a little easier
function round(value) {
  var decimals = Math.pow(10,DECIMAL_PLACES);
  return Math.round(value*decimals)/decimals;
}

2013年4月10日,星期三

报告帐户中的破损网址

注意:如果您正在寻找此辽宁福利彩票中心的版本以在MCC级别上运行,请签出 使用MCC级别辽宁福利彩票中心监视断开的链接.

更新时间:2013-05-20:基于读者的评论,该辽宁福利彩票中心现在仅检查活动的广告系列和广告组,并且仅检查每个网址一次。

更新时间:2013-04-28:基于读者的评论,我对该辽宁福利彩票中心进行了一些更新,包括将响应代码添加到电子邮件中并将结果格式化为附件。

它发生在我们最好的人身上。有时,我们会删除网站上的页面或更新链接,而忘记对我们的SEM帐户进行相应的更改。因此,今晚我整理了一个快速辽宁福利彩票中心来遍历您的所有广告和关键字,并创建一个包含以下内容的电子邮件报告: 找不到404 或一个 500服务器错误 响应码。您可以通过在辽宁福利彩票中心开头将它们添加到BAD_CODES数组中来轻松添加更多错误代码以进行检查。

谢谢,
拉斯

/****************************
* Find Broken Urls In Your Account
* Version 1.1
* ChangeLog v1.1
*  - Updated to only see Text Ads
* Created By:  拉斯  Savage
* FreeAdWordsScripts.com
****************************/
function main() {
  // You can  广告 d more if you want: http://goo.gl/VhIX
  var BAD_CODES = [404,500];
  var TO = ['[email protected]'/*,'[email protected]'*/];
  var SUBJECT = 'Broken Url Report - ' + _getDateString();
  var HTTP_OPTIONS = {
    muteHttpExceptions:true
  };
   
  //Let's look  在   广告  and 关键字 for  网址 
  var iters = [
    //For Ad Level Urls
    AdWordsApp.ads()
      .withCondition("Status = 'ENABLED'")
      .withCondition("AdGroupStatus = 'ENABLED'")
      .withCondition("CampaignStatus = 'ENABLED'")
      .withCondition("Type = 'TEXT_AD'")
      .get(),
    //For Keyword Level Urls
    AdWordsApp.keywords()
      .withCondition("Status = 'ENABLED'")
      .withCondition("DestinationUrl != ''")
      .withCondition("AdGroupStatus = 'ENABLED'")
      .withCondition("CampaignStatus = 'ENABLED'")
      .get()
    ];
  
  var already_checked = {}; 
  var bad_entities = [];
  for(var x in iters) {
    var iter = iters[x];
    while(iter.hasNext()) {
      var  实体  = iter.next();
      if(entity.getDestinationUrl() == null) { continue; }
      var url =  实体 .getDestinationUrl();
      if(url.indexOf('{') >= 0) {
        //Let's  去掉  the value track parameters
        url = url.replace(/\{[0-9a-zA-Z]+\}/g,'');
      }
      if(already_checked[url]) { continue; }
      var response_code;
      try {
        Logger.log("Testing url: "+url);
        response_code = UrlFetchApp.fetch(url, HTTP_OPTIONS).getResponseCode();
      } catch(e) {
        //Something is wrong here, we should know about it.
        bad_entities.push({e :  实体 , code : -1});
      }
      if(BAD_CODES.indexOf(response_code) >= 0) {
        //This  实体  has an issue.  Save it for later. 
        bad_entities.push({e :  实体 , code : response_code});
      }
      already_checked[url] = true;
    }
  }
  var column_names = ['Type','CampaignName','AdGroupName','Id','Headline/KeywordText','ResponseCode','DestUrl'];
  var  在 tachment = column_names.join(",")+"\n";
  for(var i in bad_entities) {
     在 tachment += _formatResults(bad_entities[i],",");
  }
  if(bad_entities.length > 0) {
    var options = { 附件: [Utilities.newBlob(attachment, 'text/csv', 'bad_urls_'+_getDateString()+'.csv')] };
    var  电子邮件 _body = "There are " + bad_entities.length + "  网址  that are  破碎 . See  在 tachment for details.";
     
    for(var i in TO) {
      MailApp.sendEmail(TO[i], SUBJECT,  电子邮件 _body, options);
    }
  }  
}
 
//Formats a row of results separated by SEP
function _formatResults(entity,SEP) {
  var e =  实体 .e;
  if(typeof(e['getHeadline']) != "undefined") {
    //this is an  广告   实体 
    return ["Ad",
            e.getCampaign().getName(),
            e.getAdGroup().getName(),
            e.getId(),
            e.getHeadline(),
             实体 .code,
            e.getDestinationUrl()
           ].join(SEP)+"\n";
  } else {
    // and this is a  关键词 
    return ["Keyword",
            e.getCampaign().getName(),
            e.getAdGroup().getName(),
            e.getId(),
            e.getText(),
             实体 .code,
            e.getDestinationUrl()
           ].join(SEP)+"\n";
  }
}
 
//Helper function to format todays date
function _getDateString() {
  return Utilities.formatDate((new Date()), AdWordsApp.currentAccount().getTimeZone(), "yyyy-MM-dd");
}

2013年1月16日,星期三

Update Ad Params 来自GoogleSpreadsheet

2013-07-11-注意:对于那些想要在广告组一级更新AdParam的用户,请查看 此辽宁福利彩票中心的更新版本.

今天,我们有了一个小辽宁福利彩票中心,可帮助您大规模调整关键字广告参数。 这是一个示例,说明如何使用与Google Spreadsheets的集成来更新关键字的param1和param2值。 我提供了一个示例电子表格,您可以对其进行复制。

只要Adwords帐户和Google Docs帐户使用相同的登录名,它就可以访问您拥有的任何电子表格。 建议您打开示例电子表格,然后将其复制到您的帐户中。 然后,您可以将以下辽宁福利彩票中心中的URL替换为电子表格副本的URL。

链接到我的示例电子表格: //docs.google.com/spreadsheet/ccc?key=0Aotb6eheEOpodC1yVjUwc2Y1NDIzUVFLLThJdTFPUnc#gid=0

谢谢,
拉斯
/************************************************
* Update Ad Params Using a Google Spreadsheet
* Version 1.1
* ChangeLog v1.1
*  - Added the ability to enable param1 or 2 individually
*  - Looks for Keywords on all sheets
*  - Runs much faster
* Created By:  拉斯  Savage
* FreeAdWordsScripts.com
************************************************/
var SPREADSHEET_URL = "THE URL FOR YOUR GOOGLE SPREADSHEET GOES HERE";
var SET_PARAM1 = true;
var SET_PARAM2 = false;
var DATA_RANGE = 'A:E'; // A - CampaignName, B - AdGroupName, 
                        // C - Keyword, D - Param1, E - Param2

function main() {
  var 电子表格 = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var allSheets = 电子表格.getSheets();
  var allData = [];
  for(var i in allSheets) {
    var sheet = allSheets[i];
    var data = sheet.getRange(DATA_RANGE).getValues();
    data.shift(); //get rid of headers
    allData = allData.concat(data);
  }
  
  var allDataHash = {};
  for(var i in allData) {
    var row = allData[i];
    if(row[0] === '') { continue; }
    var rowKey = [row[0],row[1],row[2]].join('~~!~~');
    allDataHash[rowKey] = { param1 : row[3], param2: row[4] };
  }
  
  var kwIter = AdWordsApp.keywords()
    .withCondition('CampaignStatus = ENABLED')
    .withCondition('AdGroupStatus = ENABLED')
    .withCondition('Status = ENABLED')
    .get();
  
  while(kwIter.hasNext()) { 
    var kw = kwIter.next();
    var campName = kw.getCampaign().getName();
    var  广告 GroupName = kw.getAdGroup().getName();
    var rowKey = [campName,adGroupName,kw.getText()].join('~~!~~');
    if(allDataHash[rowKey]) {
      if(SET_PARAM1) { kw.setAdParam(1, allDataHash[rowKey].param1); }
      if(SET_PARAM2) { kw.setAdParam(2, allDataHash[rowKey].param2); }
    }
  }
}

2012年12月11日,星期二

自动将ValueTrack参数添加到所有目标网址

今天,我们有了一个辽宁福利彩票中心,可以帮助确保您所有的关键字都已标记有适当的 价值追踪 parameters.  您可以使用它来确保将所有跟踪参数正确地添加到URL中。

您可以将自己的查询字符串参数添加到辽宁福利彩票中心顶部的映射中。 例如,如果帐户中的所有关键字都需要在其目标网址中包含参数“ channel = sem”,则可以将其添加到文件顶部的URL_PARAMS_TO_ADD映射中,并将其添加到所有网址中。

另外,我更新了辽宁福利彩票中心,允许您将帐户中想要的任何值添加到url中。如果愿意,请参见将广告系列和广告组名称添加到网址的示例。

谢谢,
拉斯

/******************************************
* Auto Add 价值追踪 (and other) Params If Not There
* Created By:  拉斯  Savage
* Version 1.1
* ChangeLog v1.1
*  - Added the ability to  广告 d function  呼叫 s into the parameters to  广告 d
* FreeAdWordsScripts.com
******************************************/
function main() {
   
  var URL_PARAMS_TO_ADD = { 
    "kw" : "{keyword}",
    "crid" : "{creative}",
    "mt" : "{matchtype}",
    "ntwk" : "{network}",
    "ap" : "{adposition}",
    "dv" : "{device}",
    "dvm" : "{devicemodel}",
    //"camp" : getCampaignName,  <----- This function is defined below
    //"ag" : getAdGroupName  <----- and so is this one
  };
   
  var kw_iter = AdWordsApp.keywords()
                  .withCondition("DestinationUrl != ''")
                  .get();
  
  while(kw_iter.hasNext()) {
    var kw = kw_iter.next();
    var destUrl = kw.getDestinationUrl();
    if(!destUrl || destUrl === '') { continue; }
    var toAppend = [];
    for(var key in URL_PARAMS_TO_ADD) {
      if(destUrl.indexOf(key) >= 0) { continue; }
      var value = URL_PARAMS_TO_ADD[key];
      
      //check to see if we should  呼叫  a function
      if(typeof(value) === 'function') {
        value = encodeURI(value(kw));
      }
      toAppend.push(key+"="+value);
    }
    if(destUrl.indexOf('?') >= 0) {
      kw.setDestinationUrl(destUrl + "&"+toAppend.join('&'));
    } else {
      kw.setDestinationUrl(destUrl + "?"+toAppend.join('&'));
    }
    Logger.log(kw.getDestinationUrl());
  }
}

// As long as the function  呼叫  is passed a kw object, you can insert
// whatever value you want into the url
function getCampaignName(kw) {
  return kw.getCampaign().getName();
}

function getAdGroupName(kw) {
  return kw.getAdGroup().getName();
}

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月21日,星期三

暂停没有有效关键字的广告组

这是一个快速辽宁福利彩票中心,可以暂停所有没有有效关键字的广告组。不确定这是否超级有用,但是对于大型帐户,它可能有助于确定您可以删除的广告组。

谢谢,
拉斯

/*********************************************
* 暂停没有有效关键字的广告组
* Version 1.1
* Changelog v1.1
*   - Updated for speed and  广告 ded  评论 s 
* Created By:  拉斯  Savage
* FreeAdWordsScripts.com
**********************************************/
function main() {
  // Let's start by getting all of the active AdGroups
  var agIter = AdWordsApp.adGroups()
    .withCondition('CampaignStatus = ENABLED')
    .withCondition('Status = ENABLED')
    .get();
 
  // It is faster to store them and process them all  在  once later
  var toPause = [];
  // Then we will go through each one
  while(agIter.hasNext()) {
    var ag = agIter.next();
    //get all the 关键字 that are enabled
    var kwIter = ag.keywords()
      .withCondition("Status = ENABLED")
      .get();
    
    //If .hasNext() is true, there is  在  least 1 kw in the AdGroup
    var hasKw = kwIter.hasNext(); 
    if(!hasKw) {
      toPause.push(ag);
    }
  }
  
  // Now we process them all  在  once to take  广告 vantage of batch processing
  for(var i in toPause) {
    toPause[i].pause();
  }
}

2012年11月20日,星期二

更新假期的关键字

另一天, RKGBlog 刊登了一篇很棒的文章,介绍了如何在假期期间更新关键字。其中提到的一项是将关键字中的所有年份更新为当前年份。这是一个小辽宁福利彩票中心,可以找到上一个年份的所有关键字,并在与当前年份相同的广告组中创建新的关键字。

谢谢,
拉斯
/*********************************************
* Update Keywords for the New Year
* Version 1.1
* Changelog v1.1
*   - Updated for speed and  广告 ded  评论 s 
* Created By:  拉斯  Savage
* FreeAdWordsScripts.com
**********************************************/
function main() {
  var sameDayLastYear = new Date();
  sameDayLastYear.setYear(sameDayLastYear.getYear()-1);
  var oldYearStr = sameDayLastYear.getYear().toString();
  var newYearStr = new Date().getYear().toString();
  
  Logger.log('Updating 关键字 with old year: '+oldYearStr+' to 新年: '+newYearStr);
  
  // Let's start by getting all of the 关键字
  var kwIter = AdWordsApp.keywords()
    .withCondition("Text CONTAINS " + oldYearStr)
    .withCondition("Status = ENABLED")
    .withCondition("AdGroupStatus = ENABLED")
    .withCondition("CampaignStatus = ENABLED")
    .get();
 
  // It is always better to store and batch process afterwards
  var toPause = [];
  var toCreate = [];
  while (kwIter.hasNext()) {
    var kw = kwIter.next();
    var ag = kw.getAdGroup();
    var oldText = kw.getText();
    var newText = oldText.replace(oldYearStr,newYearStr);
    // Save the info so that we can  创造  them as a batch later
    toCreate.push({ ag: ag, text: newText, cpc:kw.getMaxCpc(), destUrl : kw.getDestinationUrl() });
    // Same with the ones we want to  暂停 
    toPause.push(kw) 
  }
  // Now we  创造  the new 关键字 all  在  once
  for(var i in toCreate) {
    var elem = toCreate[i];
    elem.ag.createKeyword(elem.text, elem.cpc, elem.destUrl);
  }
  // And  暂停  the old ones all  在  once
  for(var i in toPause) {
    toPause[i].pause();
    //or toPause[i].remove(); to  删除  the old  关键词 
  }
}

2012年11月19日,星期一

暂停所有没有印象的关键字

让我们从一个非常简单的辽宁福利彩票中心开始。此关键字将找到您帐户中从未留下任何印象的所有关键字,并暂停(或删除,如果您看到下面的评论)该关键字,以免对质量得分造成负面影响。 根据Google的说法,帐户中存在的内容和停滞时间越长,对质量得分的影响就越大。 正如读者指出的那样, 第四个子弹在这里 似乎与这一说法相矛盾。这是一个很棒的辽宁福利彩票中心,可以每隔几个月安排一次,以确保您减少了帐户中的所有净额。

谢谢,
拉斯
/*********************************************
* Pause Keywords With No Impressions All Time
* Version 1.1
* Changelog v1.1
*   - Updated for speed and  广告 ded  评论 s 
* Created By:  拉斯  Savage
* FreeAdWordsScripts.com
**********************************************/
var TO_NOTIFY = "[email protected]";
function main() {
  // Let's start by getting all of the 关键字 with 没有印象
  var kwIter = AdWordsApp.keywords()
    .withCondition("Impressions = 0") // could be "Clicks = 0" also
    .forDateRange("ALL_TIME") // could use a specific date range like "20130101","20131231"
    .withCondition("Status = ENABLED")
    .withCondition("CampaignStatus = ENABLED")
    .withCondition("AdGroupStatus = ENABLED")
    .get();
 
  // It is much faster to store all the 关键字 you want to process
  // and then make the changes all  在  once. This takes  广告 vantage
  // of the batch processing behind the scenes.
  var toPause = [];
  while (kwIter.hasNext()) {
    var kw = kwIter.next();
    toPause.push(kw);
    // This is to make sure you see things during the preview
    // When you run it for real, you can  去掉  this clause to
    // increase speed.
    if(AdWordsApp.getExecutionInfo().isPreview() &&
       AdWordsApp.getExecutionInfo().getRemainingTime() < 10) {
      break;
    }
  }
  
  // Now go through each one and  暂停  them.
  for(var i in toPause) {
    toPause[i].pause();
    //Or you could use toPause[i].remove(); to  删除  the  关键词  altogether
  }
  
  // Sent an  电子邮件  to  通知  you of the changes
  MailApp.sendEmail(TO_NOTIFY, 
                    "AdWords Script Paused "+toPause.length+" Keywords.", 
                    "Your AdWords Script  暂停 d "+toPause.length+" 关键字.");
}