大家好,我是 applemint 的 Eric。
先前在〈從基礎到進階:好用 GOOGLE ADS SCRIPTS 彙整〉中,曾經分享了幾個 applemint 自己常用的 Google Ads Scripts。
今天,我們將針對其中的「月預算花費上限」來做解說。
儘管 Google Ads 可以針對個別廣告活動設定預算上限,
但目前並沒有一個好方法可以根據廣告帳號為單位,進行預算控管。
這個指令碼,便是要用來解決這個問題。
指令碼範例
var CUTOFF_COST = 80000; //月預算上限
var CUTOFF_LABEL = "Total Spend cutoff"; //達到月預算上限時,關閉有標籤的廣告活動
function main() {
var label = AdsApp.labels().withCondition("Name='" + CUTOFF_LABEL + "'").get().next();
if (AdsApp.currentAccount().getStatsFor("THIS_MONTH").getCost() > CUTOFF_COST) {
var campaignIterator = label.campaigns().get();
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
campaign.pause();
}}}
指令碼說明
第一行與第二行是最主要需要更動的地方,
CUTOFF_COST 代表該月所要設定的預算上限,
CUTOFF_LABEL 則是要關閉的廣告活動。
第二部分則是程式碼主要執行的工作。
首先,透過 AdsApp.labels().withCondition,
選擇標籤名稱包含 Total Spend cutoff 的廣告活動。
接著,如果當前帳號 (currentAccount()) 該月份的預算大於預算上限時,
那麼系統便會暫停所有包含 Total Spend cutoff 的廣告活動。
這邊可以將 THIS_MONTH 換成下列的時間區間:
TODAY, YESTERDAY, LAST_7_DAYS, THIS_WEEK_SUN_TODAY, LAST_WEEK, LAST_14_DAYS, LAST_30_DAYS, LAST_BUSINESS_WEEK, LAST_WEEK_SUN_SAT, THIS_MONTH, LAST_MONTH, ALL_TIME。
如果計算區間並不屬於上述的預設區段,那也可以自行指定,如:
AdsApp.currentAccount().getStatsFor(“20200710”,”20200809”).getCost()
稍微進階的作法,則可以透過 JavaScript 的 Date 來自動抓取「每月 10 日至隔月 9 日」的時間。
function main() {
var label = AdsApp.labels().withCondition("Name='" + CUTOFF_LABEL + "'").get().next();
var date = new Date();
var year = date.getFullYear();
var day = date.getDate();
var month = day < 10 ? date.getMonth() : date.getMonth()+1;
if (AdsApp.currentAccount().getStatsFor({year: year, month: month, day: 10},{year: year, month: month+1, day: 9}).getCost() > CUTOFF_COST) {
var campaignIterator = label.campaigns().get();
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
campaign.pause();
}
}}
另外,日前同事注意到,原本的指令碼無法停止 YouTube 影片廣告活動與購物廣告活動。上網搜尋資料後,發現影片廣告活動與購物廣告活動需要使用另外的方法 (videoCampaigns() 以及 shoppingCampaigns()) 才能取得。
因此,如果使用購物廣告或 YouTube 廣告的話,可以再將程式碼做以下調整:
function main() {
var label = AdsApp.labels().withCondition("Name='" + CUTOFF_LABEL + "'").get().next();
var date = new Date();
var year = date.getFullYear();
var day = date.getDate();
var month = day < 10 ? date.getMonth() : date.getMonth()+1;
if (AdsApp.currentAccount().getStatsFor({year: year, month: month, day: 10},{year: year, month: month+1, day: 9}).getCost() > CUTOFF_COST) {
var campaignIterator = label.campaigns().get(),
videoIterator = label.videoCampaigns().get(),
shoppingIterator = AdsApp.shoppingCampaigns()
.withCondition("LabelNames CONTAINS_ANY ['" + CUTOFF_LABEL + "']")
.get();
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
campaign.pause();
}
while (videoIterator.hasNext()) {
var campaign = videoIterator.next();
campaign.pause();
}
while (shoppingIterator.hasNext()) {
var campaign = shoppingIterator.next();
campaign.pause();
}
}}
注意事項
在使用上述指令碼以前,除了需要確認你有廣告帳號的管理權限外,
必須特別注意「新增標籤」這個步驟。
曾經我們在協助一位客戶設置此代碼時,因為沒有新增標籤,
導致該月最後超出約新台幣 1,000 元的花費。
此外,這個指令碼只負責「暫停」廣告活動,避免繼續花費,
但是並不會「開啟」廣告活動。
邏輯上可以撰寫額外的指令碼,
在進入下一個廣告週期時,重新開啟廣告活動,
但我認為這部分涉及與客戶溝通,不宜貿然自動開啟。
參考資料
- https://groups.google.com/forum/#!topic/adwords-scripts/DNpD7fbwkn4
- https://developers.google.com/google-ads/scripts/docs/features/dates
- https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_googleadsdate?hl=zh-TW
從這裡聯絡 applemint!