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.)
- 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.
- Rozhodněte o spreadsheetu. Konstantu
SPREADSHEET_URLna 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ě. - Spusťte jednou ručně. Preview, a poté
main(). Při prázdnéSPREADSHEET_URLtenhle 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. - 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ř"). - 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.
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řesAdsApp.currentAccount().getTimeZone(). Přístup ke spreadsheetu jde vždy přesSpreadsheetApp.openByUrl(), nikdy přesgetActiveSpreadsheet(), který by tu jen spadl. - Hodinová frekvence, ale denní reporty jen jednou denně.
main()je jediná naplánovaná funkce a sama si přesPropertiesServicehlí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_microsnejde v jednom GAQL dotazu ani reportu v Report Editoru kombinovat ssearch_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/RecommendedBudgetAmountv GAQL neexistují, takže se počítá jakoaktuá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é
*BudgetDataa*KPIDatalisty 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.