用於管理廣告系列預算的 Google 廣告腳本
已發表: 2021-10-23今天,作為使用 Google Ads 的廣告客戶,通過廣告系列管理特定預算是一項普遍的鬥爭。 您在 UI 中的選項是單一的:設置一個排除每小時的規則。 我的問題是為什麼? 在 2019 年通過工作表在廣告系列級別管理腳本不是很好嗎? 花了一些時間,但我想通了,您將在下面看到。 能夠在單個腳本中使用跨多個廣告系列的工作表管理預算。
在我們繼續編寫腳本之前,如果您設置的規則不是說它們不適合預算管理,這裡有一個示例,說明如何創建具有時間設置限制的規則,以根據預算暫停或啟用您的廣告系列活動。 您可以在此處找到有關自動規則的更多詳細信息。
- 登錄您的 Google Ads 帳戶。
- 轉至廣告系列、廣告組或關鍵字頁面。
- 單擊統計表上方的三點狀圖標。
- 選擇創建自動規則。
- 從“規則類型”下拉菜單中選擇暫停或啟用。
- 選擇哪種廣告系列類型
- 要添加條件,請單擊“條件”下的+ADD 。
- 定義規則的頻率,即一次、每天、每週或每月。
- 選擇您希望收到的有關影響規則的問題的電子郵件更新類型。
- 命名規則。
- 單擊預覽以確保您已將規則設置為以您想要的方式運行。 預覽僅用於驗證,不會對您的帳戶進行任何永久性更改。
- 完成後,單擊Save rule 。
在我看來,出於預算考慮,規則有好處,但不是那麼有價值。 因此,這讓我們不得不為工具付費,或者讓開發人員或工程師構建一些與 Google API 配合使用的精美腳本或內部平台。 如果我無法訪問這些資源而我只想成為廣告客戶怎麼辦? 我不能,我必須學習編碼和 API 內容,以包括及時了解所有 UI 更改和增強功能,您可以在 PPC 英雄庫中找到這些內容。
你為什麼要閱讀以及腳本是如何工作的。
此腳本通過谷歌表格按小時在廣告系列級別管理您的預算,因此您可以進行擴展。 據我所知,我已經在網上搜索過,這是第一個面向公眾的。 我沒有寫原始腳本。 可以在這里通過谷歌找到。 我只是在 1 年的時間裡刪除了一堆經過大量試驗和錯誤的東西,然後重新設計了一些東西來管理預算而不是出價。
該腳本允許您靈活地設置預算並在合理範圍內忘記它們。 如果你想發瘋,你可以按照我的方法使用這個腳本和步調腳本,只需要很少的自定義谷歌表,這樣你就有自己的預算管理工具和投標人。 我想如果有人可以構建一個工具來做這些事情並賺取數百萬美元,那麼必須有一種免費的方式來做到這一點。
我敢肯定,幾乎肯定有一種更好的方法來編寫此腳本,而且肯定有一種方法可以在 MCC 級別執行此操作來管理多個帳戶。 我還沒有弄清楚。 對於那些看到這一點的開發人員或工程師來說,對這個腳本進行調整併在 MCC 級別共享具有您自己的增強功能的免費版本會很棒。
如何設置腳本
在運行腳本之前,您需要更改以下幾項內容。
- 製作一個新的 Google Sheet。 這是腳本將知道暫停或取消暫停哪些活動的地方,一旦您創建了新工作表,請複制 URL。
- 確保您的選項卡名稱設置為“規則”,如果不是,請確保更新此行,其中“規則更改為您的選項卡名稱:var 電子表格訪問 = 新電子表格訪問(SPREADSHEET_URL,“規則”)
- 仍在 Google 表格中工作,將第 2 行更新為您的帳號“000-000-0000”,替換為您自己的帳號。
- 第 3 行是腳本運行的時間段參考,如果您想在 7 天、1 週或一個月後執行。 請參考下表以獲取此行的有效輸入,因為它與您控制預算的目標相關。

- 從第 6 行 C 列開始,您需要添加該期間的預算
- 最後,在第 6 行 D 列中,您需要列出您的廣告系列。
我希望這可以幫助大家更好地控制預算。 差點忘了,你可以在腳本改變campaign.pause到campaign.enable,如果你要複製的腳本並創建另一個腳本,使運動調節簡單的公式。
腳本
var SPREADSHEET_URL = "[https://docs.google.com/spreadsheets/d/1AbldNxsSPHkE0WcOY01AoM7EimF2_7XDrvI5FeLcarY/edit#gid=0]"; var spreadsheetAccess = new SpreadsheetAccess(SPREADSHEET_URL, "Rules"); var totalColumns; function main() { var columns = spreadsheetAccess.sheet.getRange(5, 2, 5, 100).getValues()[0]; for (var i = 0; i < columns.length; i ++) { if (columns[i].length == 0 || columns[i] == 'Results') { totalColumns = i; break; } } if (columns[totalColumns] != 'Results') { spreadsheetAccess.sheet.getRange(5, totalColumns + 2, 1, 1).setValue("Results"); } // clear the results column spreadsheetAccess.sheet.getRange(6, totalColumns + 2, 1000, 1).clear(); var row = spreadsheetAccess.nextRow(); while (row != null) { var budget; try { budget = parseBudget(row); } catch (ex) { logError(ex); row = spreadsheetAccess.nextRow(); continue; } var selector = AdWordsApp.campaigns(); for (var i = 2; i < totalColumns; i ++) { var header = columns[i]; var value = row[i]; if (!isNaN(parseFloat(value)) || value.length > 0) { if (header.indexOf("'") > 0) { value = value.replace(/\'/g,"\\'"); } else if (header.indexOf("\"") > 0) { value = value.replace(/"/g,"\\\""); } var condition = header.replace('?', value); selector.withCondition(condition); } } var campaigns = selector.get(); try { campaigns.hasNext(); } catch (ex) { logError(ex); row = spreadsheetAccess.nextRow(); continue; } var fetched = 0; var changed = 0; while (campaigns.hasNext()) { var campaign = campaigns.next(); var oldCost = campaign.getStatsFor("THIS_MONTH").getCost(); var action = row[0]; var newStatus; fetched ++; if (budget <= oldCost) { campaign.pause(); changed++ } } logResult("Fetched " + fetched + "\nChanged " + changed); row = spreadsheetAccess.nextRow(); } var now = new Date(Utilities.formatDate(new Date(), AdWordsApp.currentAccount().getTimeZone(), "MMM dd,yyyy HH:mm:ss")); } function parseBudget(row) { if (row[1].length == 0) { return null; } var limit = parseFloat(row[1]); if (isNaN(limit)) { throw "Bad Argument: must be a number."; } return limit; } function logError(error) { spreadsheetAccess.sheet.getRange(spreadsheetAccess.currentRow(), totalColumns + 2, 1, 1) .setValue(error) .setFontColor('#c00') .setFontSize(8) .setFontWeight('bold'); } function logResult(result) { spreadsheetAccess.sheet.getRange(spreadsheetAccess.currentRow(), totalColumns + 2, 1, 1) .setValue(result) .setFontColor('#444') .setFontSize(8) .setFontWeight('normal'); } function SpreadsheetAccess(spreadsheetUrl, sheetName) { this.spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl); this.sheet = this.spreadsheet.getSheetByName(sheetName); this.cells = this.sheet.getRange(6, 2, this.sheet.getMaxRows(), this.sheet.getMaxColumns()).getValues(); this.rowIndex = 0; this.nextRow = function() { for (; this.rowIndex < this.cells.length; this.rowIndex ++) { if (this.cells[this.rowIndex][0]) { return this.cells[this.rowIndex++]; } } return null; } this.currentRow = function() { return this.rowIndex + 5; } }