Předchozí verze tohoto reportu - interní šablona „Budget Pacer V.2" z listopadu 2020 - táhla data přes interní ScriptyApp/AWQL vrstvu a reporty typu CAMPAIGN_PERFORMANCE_REPORT. Fungovalo to léta, dokud Google postupně neutlumil legacy AWQL reporty, na kterých to celé stálo, a šablona přestala spolehlivě táhnout data. Dnešní jediná podporovaná cesta je GAQL přes AdsApp.search(), takže šlo o přepis od základu, ne o záplatu - a tenhle skript už na staré základně vůbec nestojí.

Co skript dělá

Budget Pacer sleduje čerpání denního rozpočtu na úrovni kampaně a hodinu po hodině skládá obrázek o tom, kdo je „v tempu" a kdo naráží na strop dřív, než den skončí. Konkrétně píše do vlastního Google Sheets souboru:

  • Today / Yesterday - hodinová křivka čerpání rozpočtu (jen náklady, proti aktuálnímu dennímu rozpočtu kampaně) s barevným přechodem podle toho, jak rychle se rozpočet plní.
  • Previous 7 Days / Previous 14 Days - denní přehled s Impression Share, Lost IS (rozpočet) a vybranými KPI, sloupce řazené od nejnovějšího dne, se dvouřádkovou hlavičkou (den v týdnu + skutečné datum).
  • Summary - dvě sekce, „Capped by Budget" (kampaně, které v posledním okně reálně narazily na strop) a „Underspending" (kampaně, které svůj rozpočet nevyčerpávají), plus sloupec Recommended Budget a mini export tabulka připravená k přímému vložení do Google Ads Editoru, seřazená podle doporučeného navýšení.
  • E-mailové upozornění - když čerpání rozpočtu překročí nastavený práh a je ještě dost hodin do konce dne na to s tím něco udělat, skript pošle HTML e-mail se seznamem dotčených kampaní.

Tabulka se nespravuje ručně - skript si při prvním spuštění sám založí kompletní spreadsheet se všemi listy, popiskami i výchozím nastavením, takže není co předpřipravovat.

Jak skript používat

Tohle je varianta pro jeden účet - vytváří se přímo uvnitř účtu Google Ads, který reportuje, ne na úrovni MCC. (Pro reportování napříč více účty z jednoho místa existuje samostatná MCC varianta téhož skriptu - jde o dva odlišné soubory, ne o jeden soubor s přepínačem.)

  1. Vložte skript do účtu. Nástroje a nastavení → Hromadné akce → Skripty → „+". Vložte celý kód níže, potvrďte oprávnění (Authorize) a uložte.
  2. Rozhodněte o spreadsheetu. Konstantu SPREADSHEET_URL na začátku souboru buď necháte prázdnou - skript si při prvním běhu sám vytvoří nový spreadsheet a zapamatuje si jeho adresu - nebo do ní vložíte URL existujícího souboru, pokud chcete report udržet na jednom známém místě.
  3. Spusťte jednou ručně. Preview, a poté main(). Při prázdné SPREADSHEET_URL tenhle první běh založí spreadsheet, kompletně popíše list „Configure Report" funkčními výchozími hodnotami a rovnou udělá první tah dat - adresu nového souboru najdete v logu běhu.
  4. Nastavte frekvenci na Hodinově. V seznamu skriptů u ikony tužky. Je to jediné plánování, které Ads Scripts nabízí, a main() si sám hlídá, co má na kterém běhu skutečně proběhnout (víc v sekci „Jak skript funguje uvnitř").
  5. Doladíte v listu „Configure Report". Zaškrtnete, které reporty se mají generovat (Hodinově / Previous 7 Days / Previous 14 Days), jaké KPI sloupce chcete vidět, minimální denní rozpočet pro zařazení kampaně do reportu, okno pro výpočet KPI (1/7/14/30 dní) a případně zapnete e-mailová upozornění s prahem čerpání a hodinou, do které ještě dává smysl upozorňovat.
GOOGLE ADS BUDGET PACER

načítám…

Co je potřeba upravit

Oproti typickému skriptu tady skoro nic není potřeba měnit přímo v kódu. Jediná konstanta na začátku souboru, kterou má smysl řešit, je:

  • SPREADSHEET_URL - nepovinné. Prázdné necháte, pokud chcete, ať si skript vytvoří spreadsheet sám; vyplníte, jen pokud chcete report navázat na už existující soubor.

Všechno ostatní - které reporty běží, jaké KPI se zobrazují, filtr minimálního rozpočtu, okno pro KPI, e-mailová upozornění a jejich příjemci - se nastavuje v listu „Configure Report" přímo ve vygenerovaném spreadsheetu, ne v kódu. Skript si tenhle list sám kompletně popíše (nadpisy, zaškrtávátka, rozbalovací seznamy) hned při prvním spuštění, takže je hned jasné, co která buňka znamená.

Jak skript funguje uvnitř

Pár rozhodnutí, která nejsou vidět na první pohled, ale hodí se je znát, než skript upravíte:

  • Žádný ScriptApp, žádný Session. Ads Scripts nemají vlastní trigger API ani aktivní spreadsheet - jediné plánování je frekvence v UI a časovou zónu skript čte přes AdsApp.currentAccount().getTimeZone(). Přístup ke spreadsheetu jde vždy přes SpreadsheetApp.openByUrl(), nikdy přes getActiveSpreadsheet(), který by tu jen spadl.
  • Hodinová frekvence, ale denní reporty jen jednou denně. main() je jediná naplánovaná funkce a sama si přes PropertiesService hlídá, jestli dnešní den už Previous 7/14 Days obnovil. Brána je „první běh daného kalendářního dne", ne pevná hodina - díky tomu i ruční testovací spuštění hned po nasazení doplní všechny listy, místo aby čekalo na konkrétní čas.
  • Rozpočet se dotahuje samostatně. campaign_budget.amount_micros nejde v jednom GAQL dotazu ani reportu v Report Editoru kombinovat s search_impression_share / search_budget_lost_impression_share - Google Ads to rovnou odmítne. Rozpočet se tak tahá samostatným, nesegmentovaným dotazem a k výkonnostním řádkům se připojuje až ve skriptu podle Campaign ID.
  • Impression Share jen na úrovni dne. Hodinově segmentované IS metriky jsou v Ads API dlouhodobě nespolehlivé (často vrací nuly), takže hodinová křivka počítá jen s náklady a IS/Lost IS se řeší výhradně na denní/okenní úrovni.
  • Recommended Budget je heuristika, ne pole z API. HasRecommendedBudget/RecommendedBudgetAmount v GAQL neexistují, takže se počítá jako aktuální rozpočet × (1 + Budget Lost IS) - tedy „jaký rozpočet by stačil zachytit i ty imprese, co kampaň včera ztratila kvůli stropu".
  • Žádné fabulování u neznámých hodnot. Když kampaň v daném okně neutratila nic, Search IS / Budget Lost IS ani z nich odvozený Recommended Budget nejsou 0 % ani 0 Kč - jsou neznámé, a tak se v reportu zobrazí doslova "--". Ostatní KPI (Conversions, CPA, ROAS, Ctr, Conv.Rate, Lost Conversions, Lost Revenue) se bez dat chovají standardně a defaultují na 0.
  • Skryté listy jsou surový dump, ne pavučina vzorců. Přepočty dělá skript, do viditelných listů zapisuje rovnou hodnoty. Skryté *BudgetData a *KPIData listy slouží jen jako plochý zdroj dat pro spárování podle Campaign ID - žádné IFERROR(INDEX(MATCH(...))) řetězce, které se dřív uměly rozbít při jakékoli změně pořadí řádků.

Máte-li zájem o další skripty a automatizace, prohlédněte si všechny zápisky ze sekce Skripty.