用於管理廣告系列預算的 Google 廣告腳本

已發表: 2021-10-23

今天,作為使用 Google Ads 的廣告客戶,通過廣告系列管理特定預算是一項普遍的鬥爭。 您在 UI 中的選項是單一的:設置一個排除每小時的規則。 我的問題是為什麼? 在 2019 年通過工作表在廣告系列級別管理腳本不是很好嗎? 花了一些時間,但我想通了,您將在下面看到。 能夠在單個腳本中使用跨多個廣告系列的工作表管理預算。

在我們繼續編寫腳本之前,如果您設置的規則不是說它們不適合預算管理,這裡有一個示例,說明如何創建具有時間設置限制的規則,以根據預算暫停或啟用您的廣告系列活動。 您可以在此處找到有關自動規則的更多詳細信息。

  1. 登錄您的 Google Ads 帳戶。
  2. 轉至廣告系列廣告組關鍵字頁面。
  3. 單擊統計表上方的三點狀圖標。
  4. 選擇創建自動規則
  5. 從“規則類型”下拉菜單中選擇暫停或啟用
  6. 選擇哪種廣告系列類型
  7. 要添加條件,請單擊“條件”下的+ADD
  8. 定義規則的頻率,即一次、每天、每週或每月
  9. 選擇您希望收到的有關影響規則的問題的電子郵件更新類型。
  10. 命名規則。
  11. 單擊預覽以確保您已將規則設置為以您想要的方式運行。 預覽僅用於驗證,不會對您的帳戶進行任何永久性更改。
  12. 完成後,單擊Save rule

在我看來,出於預算考慮,規則有好處,但不是那麼有價值。 因此,這讓我們不得不為工具付費,或者讓開發人員或工程師構建一些與 Google API 配合使用的精美腳本或內部平台。 如果我無法訪問這些資源而我只想成為廣告客戶怎麼辦? 我不能,我必須學習編碼和 API 內容,以包括及時了解所有 UI 更改和增強功能,您可以在 PPC 英雄庫中找到這些內容。

你為什麼要閱讀以及腳本是如何工作的。

此腳本通過谷歌表格按小時在廣告系列級別管理您的預算,因此您可以進行擴展。 據我所知,我已經在網上搜索過,這是第一個面向公眾的。 我沒有寫原始腳本。 可以在這里通過谷歌找到。 我只是在 1 年的時間裡刪除了一堆經過大量試驗和錯誤的東西,然後重新設計了一些東西來管理預算而不是出價。

該腳本允許您靈活地設置預算並在合理範圍內忘記它們。 如果你想發瘋,你可以按照我的方法使用這個腳本和步調腳本,只需要很少的自定義谷歌表,這樣你就有自己的預算管理工具和投標人。 我想如果有人可以構建一個工具來做這些事情並賺取數百萬美元,那麼必須有一種免費的方式來做到這一點。

我敢肯定,幾乎肯定有一種更好的方法來編寫此腳本,而且肯定有一種方法可以在 MCC 級別執行此操作來管理多個帳戶。 我還沒有弄清楚。 對於那些看到這一點的開發人員或工程師來說,對這個腳本進行調整併在 MCC 級別共享具有您自己的增強功能的免費版本會很棒。

如何設置腳本

在運行腳本之前,您需要更改以下幾項內容。

  1. 製作一個新的 Google Sheet。 這是腳本將知道暫停或取消暫停哪些活動的地方,一旦您創建了新工作表,請複制 URL。
  2. 確保您的選項卡名稱設置為“規則”,如果不是,請確保更新此行,其中“規則更改為您的選項卡名稱:var 電子表格訪問 = 新電子表格訪問(SPREADSHEET_URL,“規則”)
  3. 仍在 Google 表格中工作,將第 2 行更新為您的帳號“000-000-0000”,替換為您自己的帳號。
  4. 第 3 行是腳本運行的時間段參考,如果您想在 7 天、1 週或一個月後執行。 請參考下表以獲取此行的有效輸入,因為它與您控制預算的目標相關。
Google 廣告腳本時間範圍選項
  • 從第 6 行 C 列開始,您需要添加該期間的預算
  • 最後,在第 6 行 D 列中,您需要列出您的廣告系列。

我希望這可以幫助大家更好地控制預算。 差點忘了,你可以在腳本改變campaign.pausecampaign.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; } }