2013年6月6日更新:请确保在重置预算后,将预算除以30.5,以将其转化为每日预算(第95行)。
更新2013-04-07:非常感谢FoxSUP帮助我跟踪更新预算的问题。修复了第78行,将当前预算乘以1 + to_change,而不仅仅是to_change。还修复了计算更改时的错误(第56行)。
这是我放在一起的上一个辽宁福利彩票中心的更新 动态调整广告系列预算。一些评论提出了一些要求,我认为将它们合并到一个新帖子中会更容易。
现在,该辽宁福利彩票中心将跟踪您在本月初通过Google Spreadsheet设置的预算。如果只希望此标签在具有该标签名称的广告系列上运行,则也可以填写LABEL值。将其保留为空白可在所有广告系列上使用。
谢谢,
拉斯
/******************************** * 动态调整广告系列预算 v2.1 * Changelog v2.1 - Fixed opening of 电子表格 * Created By: 拉斯 Savage * FreeAdWordsScripts.com ********************************/ // Let's set some constants var TIMEFRAME = "THIS_MONTH"; //if the 运动 is not in the 电子表格, the 预算 is reset //to this value 在 the beginning of the month. var DEFAULT_BUDGET = 100; var SPREADSHEET_URL = "PLACE EMPYT SPREADSHEET URL HERE"; var LABEL = ""; //Fill in if you only want to operate on 运动s with this 标签 var SIG_FIGS = 1000; //this 意思s round all calculations to 3 decimal places var MONTHLY_BUDGET = 0; // we will set this later function main() { MONTHLY_BUDGET = _pull_budget_data_from_spreadsheet(); var tot_cost_mtd = _get_total_cost(); var is_first_of_the_month = ((new Date()).getDate() == 1); is_first_of_the_month = (is_first_of_the_month && ((new Date()).getHours() == 0)); Logger.log("Total cost: " + tot_cost_mtd + ", Monthly 预算:" + MONTHLY_BUDGET); if(is_first_of_the_month) { _reset_budgets(); } else { _adjust_campaign_budget(tot_cost_mtd); } } // Returns the total cost for the set TIMEFRAME function _get_total_cost() { var camp_iter = (LABEL == "") ? AdWordsApp.campaigns().get() : AdWordsApp.campaigns() .withCondition("LabelNames CONTAINS_ANY ['"+LABEL+"']") .get(); var tot_cost = 0; while(camp_iter.hasNext()) { tot_cost += camp_iter.next().getStatsFor(TIMEFRAME).getCost(); } return tot_cost; } // Calculates 运行速度 and 广告 justs 运动 竞标 as needed. function _adjust_campaign_budget(my_tot_cost) { var today = new Date(); // Accounting for December var eom = (today.getMonth() == 11) ? new Date(today.getFullYear()+1,0,1) : new Date(today.getFullYear(),today.getMonth()+1,1); var days_left = Math.round((eom-today)/1000/60/60/24); var days_spent = today.getDate(); var run_rate = Math.round(my_tot_cost/days_spent*SIG_FIGS)/SIG_FIGS; var projected_total = my_tot_cost + (run_rate * days_left); var perc_over = Math.round(((MONTHLY_BUDGET-projected_total)/projected_total)*SIG_FIGS)/SIG_FIGS; _change_spend(perc_over,my_tot_cost); } //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 _change_spend(perc_to_change,my_tot_cost) { var camp_iter = (LABEL == '') ? AdWordsApp.campaigns() .withCondition("Status = ENABLED") .get() : AdWordsApp.campaigns() .withCondition("Status = ENABLED") .withCondition("LabelNames CONTAINS_ANY ['"+LABEL+"']") .get(); while(camp_iter.hasNext()) { var camp = camp_iter.next(); var camp_cost = camp.getStatsFor(TIMEFRAME).getCost(); var perc_of_total = Math.round(camp_cost/my_tot_cost*SIG_FIGS)/SIG_FIGS; //If there is no cost for the 运动, let's not change it. var to_change = (perc_of_total) ? (perc_of_total*perc_to_change) : 0; camp.setBudget(camp.getBudget()*(1+to_change)); } } // Resets the 预算 unevenly function _reset_budgets() { var camp_budget_map = _pull_campaign_data_from_spreadsheet(); var camp_iter = (LABEL == '') ? AdWordsApp.campaigns() .withCondition("Status = ENABLED") .get() : AdWordsApp.campaigns() .withCondition("Status = ENABLED") .withCondition("LabelNames CONTAINS_ANY ['"+LABEL+"']") .get(); while(camp_iter.hasNext()) { var camp = camp_iter.next(); if(camp_budget_map[camp.getName()]) { camp.setBudget(camp_budget_map[camp.getName()]/30.5); } else { camp.setBudget(DEFAULT_BUDGET); } } } function _pull_campaign_data_from_spreadsheet() { var 电子表格 = getSpreadsheet(SPREADSHEET_URL); var sheet = 电子表格.getActiveSheet(); var data = sheet.getRange("A:B").getValues(); if(data[0][0] == "") { //This 意思s this is the first run and we should populate the data. _populate_spreadsheet(sheet); data = sheet.getRange("A:B").getValues(); } var 运动_budget_map = {}; for(var i in data) { if(i == 0) { continue; } //ignore the header if(data[i][0] == "") { break; } //stop when there is no more data campaign_budget_map[data[i][0]] = parseFloat(data[i][1]); } return 运动_budget_map; } function _pull_budget_data_from_spreadsheet() { var 电子表格 = getSpreadsheet(SPREADSHEET_URL); var sheet = 电子表格.getActiveSheet(); var data = sheet.getRange("A:B").getValues(); if(data[0][0] == "") { //This 意思s this is the first run and we should populate the data. _populate_spreadsheet(sheet); data = sheet.getRange("A:B").getValues(); } var tot_budget = 0; for(var i in data) { if(i == 0) { continue; } //ignore the header if(data[i][1] == "") { break; } //stop when there is no more data tot_budget += parseFloat(data[i][1]); } return tot_budget; } function _populate_spreadsheet(sheet) { sheet.clear(); sheet.appendRow(['Campaign Name','Monthly Budget']); var camp_iter = (LABEL == '') ? AdWordsApp.campaigns() .withCondition("Status = ENABLED") .get() : AdWordsApp.campaigns() .withCondition("Status = ENABLED") .withCondition("LabelNames CONTAINS_ANY ['"+LABEL+"']") .get(); while(camp_iter.hasNext()) { var camp = camp_iter.next(); sheet.appendRow([camp.getName(),(camp.getBudget()*30.5)]); } } function getSpreadsheet(spreadsheetUrl) { return SpreadsheetApp.openByUrl(spreadsheetUrl); }