2013年3月18日,星期一

Dynamically Adjust Campaign 预算s

UPDATE 2013-04-05: There is an 更新d version of this 脚本. Check it out. Dynamically Adjust Campaign 预算s v2.0.

更新2013-04-07:非常感谢FoxSUP帮助我跟踪更新预算的问题。修复了第78行,将当前预算乘以1 + to_change,而不仅仅是to_change。还修复了计算更改的错误(第76行)。

这是读者的请求:
我管理着许多小型企业PPC帐户,其中一些帐户有多个广告系列,并且它们通常具有相对较小的每月点击预算。我正在寻找一种方法来暂停所有广告系列,前提是整个帐户自一个月至今已花费了一定金额。

实际上,这是一个非常容易组合的脚本。下面是一个脚本,将执行此操作。您可以在脚本的开头设置MONTHLY_BUDGET,并每天在您的帐户上运行此脚本。一旦这些广告系列的总费用高于指定的预算,它将暂停该帐户中的所有广告系列。

Then, on the first of the next month, it will enable those 运动s once again. If you make no changes to the 脚本 below, it should do just that. But let's go one step further.

实际上,您可以使用脚本来获取和设置广告系列预算。假设您的每月预算是$ 100,但是您要确保您的广告在整个月中的投放量都没有变化。我在下面添加了一个名为_adjust_campaign_budget()的函数,可以通过脚本顶部的标志ADJUST_BUDGETS启用该函数。

然后,脚本将尝试计算广告系列的运行率,以确定您是否要满足预算。如果您要结束,它将降低每个广告系列的预算(按广告系列费用加权),从而使您实现目标。如果您的支出不足,它还会尝试增加您的广告系列预算,以使您达到目标。我还添加了一个_reset_budgets()函数,该函数在每月的第一天被调用。如果您更频繁地运行此脚本,则应启用代码以检查是否是该月第一天的第一个小时。

Now understandably, this 脚本 comes with a few cautions. 该脚本可能使您花费很多钱。 我确信我正在测试的广告系列比您的广告系列要小得多,而且预算可以匹配。

谢谢,
拉斯

/******************************************
* Keep Your Campaigns In 预算
* Version 1.1
* ChangeLog v1.1 
*   - cleaned up code
*   - 广告 ded ability for any 日期
* Created By: 拉斯 Savage
* FreeAdWordsScripts.com
******************************************/
// Let's set some constants
var MONTHLY_BUDGET = 5000.00;

//If you want to work with a monthly 预算, leave START_DATE and END_DATE blank.
var TIMEFRAME = "THIS_MONTH";
//But if you want to work with a specific timeframe, fill these in.
//Use the format yyyyMMdd, so for Jan 12th, 2014, you would put 20140112.
var START_DATE = '';
var END_DATE = '';
 
//Set this to true if you want to 调整预算 or
//keep set to false if you want to just 暂停 all the 运动s
//when you hit your 预算
var ADJUST_BUDGETS = false;
var DECIMAL_PLACES = 3;
 
function main() {
  var totalCostMTD = getTotalCost();
  var isFirstOfTheMonth = ((new Date()).getDate() == 1);
  if(START_DATE && END_DATE) {
    var today = new Date();
    today.setHours(0,0,0,0);
    var startDate = new Date(START_DATE.substring(0,4),
                             parseFloat(START_DATE.substring(4,6))-1,
                             START_DATE.substring(6,8));
    isFirstOfTheMonth = (startDate.getTime() == today.getTime());
  }
  //if you run this 脚本 more than once per day, uncomment the next line
  //isFirstOfTheMonth = (isFirstOfTheMonth && ((new Date()).getHour() == 0));
  Logger.log("Total cost: " + totalCostMTD + 
           ", Monthly 预算:" + MONTHLY_BUDGET +
           ", isFirstOfTheMonth: "+isFirstOfTheMonth);
   
  if(ADJUST_BUDGETS) {
    if(isFirstOfTheMonth) {
      resetBudgets();
    } else {
      adjustCampaignBudget(totalCostMTD);
    }
  } else {
    if(totalCostMTD >= MONTHLY_BUDGET) {
      //If we have hit the limit, 暂停 all 广告
      enableOrDisableCampaigns(true);
    } else {
      // let's check if it's the first day of the month
      if((new Date()).getDate() == 1) {
        //enable all the 运动s
        enableOrDisableCampaigns(false);
      }
    }
  }
}
 
// Returns the total cost for the set TIMEFRAME
function getTotalCost() {
  var campIter = AdWordsApp.campaigns().get();
   
  var totalCost = 0;
  while(campIter.hasNext()) {
    if(START_DATE && END_DATE) {
      totalCost += campIter.next().getStatsFor(START_DATE,END_DATE).getCost();
    } else {
      totalCost += campIter.next().getStatsFor(TIMEFRAME).getCost();
    }
  }
  return totalCost;
}
 
// Enables or Disables All Campaigns In Account
function enableOrDisableCampaigns(shouldDisable) {
  var campIter = AdWordsApp.campaigns().get();
  while(campIter.hasNext()) { 
    if(shouldDisable) { 
      campIter.next().pause(); 
    } else { 
      campIter.next().enable(); 
    }
  }
}
 
// Calculates 运行速度 and 广告 justs 运动 竞标 as needed.
function 广告 justCampaignBudget(myTotalCost) {
  var today = new Date();
  // Accounting for December
  var eom;
  if(START_DATE && END_DATE) {
    eom = new Date(END_DATE.substring(0,4),
                   parseFloat(END_DATE.substring(4,2))-1,
                   END_DATE.substring(6,2));
  } else {
    eom = (today.getMonth() == 11) ? new Date(today.getFullYear()+1,0,1) : 
                                     new Date(today.getFullYear(),today.getMonth()+1,1);
  }
  var daysLeft = Math.round((eom-today)/1000/60/60/24);
  var daysSpent;
  if(START_DATE && END_DATE) {
    var startDate = new Date(START_DATE.substring(0,4),
                             parseFloat(START_DATE.substring(4,2))-1,
                             START_DATE.substring(6,2));
    daysSpent = Math.round((today-startDate)/1000/60/60/24);
  } else {
    daysSpent = today.getDate();
  }
  var runRate = round(myTotalCost/daysSpent);
  var projectedTotal = myTotalCost + (runRate * daysLeft);
  var percOver = round((MONTHLY_BUDGET-projectedTotal)/projectedTotal);
   
  changeSpend(percOver,myTotalCost);
}
 
//Adjusts the 预算 for a given 运动 based on percentage of total spend
//Note: if the cost of a 运动 is $0 mtd, the 预算 is not changed.
function changeSpend(percToChange,myTotalCost) {
  var campIter = AdWordsApp.campaigns().withCondition("状态=已启用").get();
   
  while(campIter.hasNext()) {
    var camp = campIter.next();
    var campCost = (START_DATE && END_DATE) ? camp.getStatsFor(START_DATE,END_DATE).getCost()
                                            : camp.getStatsFor(TIMEFRAME).getCost();
    var percOfTotal = round(campCost/myTotalCost);
    //If there is no cost for the 运动, let's not change it.
    var toChange = (percOfTotal) ? (percOfTotal*percToChange) : 0;
    camp.setBudget(camp.getBudget()*(1+toChange));
  }
}
 
// Resets the 预算 evenly across all 运动s
function resetBudgets() {
  Logger.log('Resetting 预算s 在 the first of the period.');
  var campIter = AdWordsApp.campaigns().withCondition("状态=已启用").get();
  var campCount = 0;
  while(campIter.hasNext()) {
    campCount++;
    campIter.next();
  }
  campIter = AdWordsApp.campaigns().withCondition("状态=已启用").get();
  while(campIter.hasNext()) {
    campIter.next().setBudget(MONTHLY_BUDGET/campCount);
  }
}

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

23条评论:

  1. Excellent 脚本... I was about half way done with something very similar, and this post helped to resolve few obstacles...Thanks!

    回复删除
  2. Thanks again for the 脚本. In regards to the 运动s reactivating on the first of the month, would this 脚本 enable every 运动 that is currently in a "paused"在帐户中说明是否在上个月启用了广告系列?

    如果是这样,应删除代码的哪几行?就我个人而言'最好在每月的第一天返回帐户,然后手动重新激活特定的广告系列。

    谢谢!

    回复删除
    回覆
    1. 嗨,马克,您是正确的,此脚本将启用帐户中所有已暂停的广告系列。仅在某些广告系列上运行此脚本的最简单方法可能是使用标签。所以让'假设您创建了一个名为'script'并将其应用于您要为其管理预算的广告系列。

      Then, anywhere in the 脚本 where you see a camp_iter (lines 45, 56, 84, and 98), 广告 d the following .withCondition("LabelNames CONTAINS_ANY ['script']")就在.get()之前;

      var camp_iter = AdWordsApp.campaigns()
      .withCondition("Status = ENABLED")
      .withCondition("LabelNames CONTAINS_ANY ['script']")
      。得到();

      That way the 脚本 will only operate on certain 运动s.

      谢谢,
      拉斯

      删除
  3. I love this 脚本, I set it up with the 标签 to control individual 运动 预算s and its working great.

    我还在所有广告系列中都尝试过此方法,但是我想在不同的广告系列上花费不同的金额,但它不会保留这些价值。关于如何最好地实现这一目标的任何想法?

    感谢您的时间和精力发布有用的AdWords脚本。

    回复删除
    回覆
    1. Hi 福克斯, Yeah, right now, the 脚本 just simply divides your monthly 预算 equally across all your 运动s (line 106).

      There are a few different ways you could solve the 预算 thing. I think the easiest way might be to store the 运动 信息 in an external 电子表格 and read those values 在 the start of each month. That way, you could 调整预算 without changing the 脚本.

      对此所做的更改相当可观,因此我将其放在单独的文章中: Dynamically Adjust Campaign 预算s v2.0.

      谢谢,
      拉斯

      删除
    2. 该评论已被博客管理员删除。

      删除
    3. 嗨,FoxSUP,我对30.5的多个预算进行了少量更改,以处理每日到每月的发行。

      谢谢,
      拉斯

      删除
  4. For anyone 广告 justing 预算s using this 脚本, I fixed a bug that should 广告 just the 运动 预算s correctly. A big thanks to 福克斯 for helping me track down some issues.

    谢谢,
    拉斯

    回复删除
  5. 嗨罗素,

    I enjoyed all the 脚本s on your blog and i found them very help full for my MCC and i have to thank you for this.

    I have a 题 witch i think it apply to this 脚本: It'有没有办法在电子表格中查看帐户中所有广告系列的总预算和费用?
    目标是使总费用与最近30天或最近7天(每周)之间的日期相关联。

    谢谢。

    回复删除
    回覆
    1. Hi 丹妮, I think you might be better off using this 脚本 to store that data independently: 在Google文档中存储帐户效果报告。让我知道是否可以解决您的问题。

      谢谢,
      拉斯

      删除
    2. 嗨罗素,

      I looked up for that 脚本 but it seems i don'我放下后,就有可能从ACCOUNT_PERFORMANCE_REPORT中提取预算'Budget' in the var columns.

      "Column 'Budget'对报告类型ACCOUNT_PERFORMANCE_REPORT无效。仔细检查您的SELECT子句。 (第33行)"

      我的目标是看成本是否达到了's 预算.

      谢谢。

      删除
    3. 嗨,丹妮,你'由于某种原因重新纠正该报告'工作。您想要的是BUDGET_PERFORMANCE_REPORT。我试图使其他脚本具有足够的通用性,以用于AdWords提供的大多数报告。要更新其他脚本,只需执行以下操作即可将ACCOUNT_PERFORMANCE_REPORT替换为BUDGET_PERFORMANCE_REPORT,并使用此处的值更新列列表: BUDGET_PERFORMANCE_REPORT列,您应该会很好。

      让我知道这是否适合您。
      谢谢,
      拉斯

      删除
    4. 嗨罗素,

      Thanks man, the BUDGET_PERFORMANCE_REPORT works ok, and it is that one was i looking for but the thing is (problem) it imports in docs all the 运动s even if it is 删除d or 已暂停.
      有什么提示仅导入启用露营广告吗?

      My 脚本 looks like this:

      // -----------------------------------
      // Store 预算 Performance Report In A Google Doc
      //创建者:Russ Savage
      // FreeAdWordsScripts.com
      // -----------------------------------
      函数main(){
      vareBook_url ="spreadsheet_url";
      var date_range ='LAST_WEEK';
      var列= ['AssociatedCampaignName',
      'AssociatedCampaignStatus',
      'Amount',
      'Cost'];
      var columns_str = columns.join(',') + " ";

      var sheet = getSpreadsheet(spreadsheet_url).getActiveSheet();
      如果(sheet.getRange('A1:A1').getValues()[0] [0] =="") {
      sheet.clear();
      sheet.appendRow(columns);
      }

      var report_iter = AdWordsApp.report(
      'SELECT ' + columns_str +
      '来自BUDGET_PERFORMANCE_REPORT' +
      'DURING ' +date_range, {
      apiVersion:'v201302'
      })。rows();

      while(report_iter.hasNext()){
      var row = report_iter.next();
      var row_array = [];
      for(var i in columns){
      row_array.push(row [columns [i]]);
      }
      sheet.appendRow(row_array);
      }
      }

      函数getSpreadsheet(spreadsheetUrl){
      var matchs = new RegExp('key=([^&#]*)').exec(spreadsheetUrl);
      if(!matches ||!matches [1]){
      扔'电子表格网址无效:' + 电子表格Url;
      }
      var电子表格ID =匹配项[1];
      返回SpreadsheetApp.openById(spreadsheetId);
      }

      删除
    5. 丹妮,您好:为了仅获得活跃的广告系列,您应该在AWQL语句中添加WHERE子句。因此,在DURING子句之前,添加"WHERE AssociatedCampaignStatus ='ACTIVE'".

      谢谢,
      拉斯

      删除
  6. 非常感谢您的帮助 信息。这正是我所需要的!

    回复删除
  7. 我的预付中心 还可以在美国,英国和加拿大在线激活卡。

    回复删除
  8. Excellent 脚本... I was about half way done with something very similar, and this post helped to resolve few obstacles) I'我只是在学习,所以'对我来说是完美的信息。如果您需要简历帮助,可以通过以下途径获得 //top-papers.com/where-to-buy-resume-paper.

    回复删除



  9. 代贷款,我有了新想法
    六个月内每周可获得$ 10,050 USD!

    看看它怎么运作
    您知道您可以使用被入侵的ATM卡入侵任何一台ATM机吗?
    申请前先下定决心,直接交易...
    立即订购空白的ATM卡,并在一周之内赚到数百万美元!:请与我们联系
    通过电子邮件地址:: [email protected]或whats-app +1(323)-723-2568

    我们有专门编程的ATM卡,可用于破解ATM
    机器上,可以使用ATM卡在ATM上取款或在以下位置刷卡
    商店和POS。我们将此卡出售给我们所有的客户和有兴趣的人
    全世界的买家,该卡在ATM上的每日提款限额为$ 2,500
    以及商店中最高$ 50,000的消费限制,具体取决于卡的种类
    您订购以下商品::以及是否需要其他任何网络黑客服务
    服务,我们随时为您服务。
    这是我们的ATM卡价格表:
    每天提取$ 5,500的卡需要支付$ 200 USD
    每天提取$ 10,000的卡需要支付$ 850 USD
    每天提取$ 35,000的卡需要$ 2,200 USD
    每天提取$ 50,000的卡需要支付$ 5,500 USD
    每天提取100,000美元的卡的费用为8,500美元
    在申请前下定决心,直接交易!!!

    价格包括运输费用,请立即订购:通过联系我们
    电子邮件地址:: [email protected]或whats-app +1(323)-723-2568

    回复删除
  10. 您是否需要入侵Facebook,电子邮件,Whatsapp,Viber,Snapchat,Instagram等上的任何数据库服务器间谍。
    我敦促您与最出色的人保持联系,当我需要监视配偶电话时,我已经确认了服务。他们擅长电话克隆和比特币/二进制挖掘以及任何其他黑客工作。
    谢谢大家的团队合作HACKINTECHNOLOGYATGMAILDOTCOM
    +12132951376(WHATSAPP)

    回复删除
  11. 3 2 2提供高质量和快速的服务,事实证明,他们在创建mspy应用程序方面的声誉卓著,该应用程序使我的离婚案胜诉。 ....... Mspy应用程序作为所有传入和传出消息,访问位置,获取有关呼叫日志的所有信息以及查看各种聊天应用程序消息的传递服务。通过gmail与他联系(C O M P U T E R G U R U 3 2 2)。 com,它们经过测试和信任吗?

    回复删除
  12. Welcome. BE NOT TROUBLED anymore. you’re 在 the right place. Nothing like having trustworthy hackers. have you lost money before or bitcoins and are looking for a hacker to get your money back? You should contact us right away. It's very affordable and we give guarantees to our clients. Our hacking services are as follows:  Website://creditcardsatm.wixsite.com/website  电子邮件:[email protected] 
    -入侵任何类型的手机
    _增加信用分数
    _Western Union,比特币和金钱克黑客
    _犯罪记录删除_空白ATM /信用卡
    _电话窃听(您的配偶,老板,朋友的窃听,看看背后正在讨论的一切)
    _安全系统黑客攻击等等。立即与他们联系并获得您想要的任何东西
    电子邮件:[email protected] 
    什么是应用程式:+1(305)330-3282  

    为什么您需要劫持黑客??:
    人们需要雇用黑客的原因有很多,可能是黑客入侵网站来破坏信息,检索信息,编辑信息或为您提供管理员访问权限。
    •某些人可能需要我们破解目标智能手机,以便他们可以访问电话上的所有活动,例如短信,通话记录,社交媒体应用程序和其他信息
    •有些人可能需要破解一个Facebook,gmail,Instagram,twitter和其他社交媒体帐户,
    •另外,有些人可能想追踪别人'可能是调查案件的地点
    •有些人可能需要我们闯入法庭's清除犯罪记录的数据库。
    •但是,有些人可能因使用二元期权经纪人或BTC采矿而损失了太多资金,并希望收回资金
    •所有这些都是我们可以借助我们的Root Hack工具,特殊Hack工具和超越所有其他Hacker的技术Hacking策略而尽快完成的。

    ★我们提供的特殊服务是:
    *二元期权的损失资金回收
    *信用卡正在加载{任何国家}
    *银行帐户加载 {Any country}

    ★您也可以与我们联系以进行其他网络攻击和劫持,我们将全力以赴★

    ★ CONTACTS:
    * For Binary Options Recovery,feel free to contact ([email protected])for a wonderful job well done,stay safe.  Website://creditcardsatm.wixsite.com/website  

    为什么要浪费时间等待月薪。如果您可以在5至7天内在家中赚到$ 3,000,                     
    投资$ 300并赚取$ 3,000
    投资$ 500并赚取$ 5,000
    投资600美元并获得6,000美元
    投资700美元并获得7,000美元
    投资$ 800可获得$ 8,000
    投资$ 900并赚取$ 9,000
    投资$ 1000并赚取$ 10,000

    它已经过测试和信任  

    回复删除