SteerAds
GuideOptimisationGoogle Ads

Google Ads Scripts: 10 hotových skriptů

Google Ads Scripts = JavaScript spuštěný Googlem na jejich infrastruktuře s nativním přístupem k Google Ads API. Spend alerty, automatická vyloučená, audity účtů, týdenní reporty — tady je 10 nejziskovějších skriptů k instalaci v 2026, s klíčovým code snippetem, doporučeným harmonogramem a odhadovanou časovou úsporou.

Matt
MattTracking & Data Lead
···13 min čtení

Účty spuštěné s alespoň 5 Google Ads Skripty utrácejí 18 až 26 % méně promrhaného rozpočtu — parazitní search termy, neodhalené 404, nekonzistentní bidy. Přesto jen 12-18 % SMB ve Francii je v 2026 používá. Mezera je největší dostupný automatizační ROI, za pár hodin instalace.

Google Ads Scripts zůstává v 2026 jednou z nejvíc nevyužívaných platform features. Napříč našimi auditovanými účty 2025 jen 12-18 % francouzských SMB aktivně používá Google Ads Scripts (podle zdroje), zatímco kolem deseti dobře navržených skriptů šetří 10 až 15 hodin týdně pro ops. Vstupní ticket je přitom mizivý: JavaScript úrovně začátečníka, free execution hostovaný Googlem, nula infry k udržování.

Tento průvodce listuje 10 nejziskovějších skriptů k okamžité instalaci, u každého klíčový code snippet, doporučený cron schedule, průměrný čas zisku a vhodný use case. Ne kompletní copy-paste — pro to oficiální Google Ads Scripts dokumentace zůstává referencí. Tady se zaměřujeme na co a proč, se snippety, které zabíjejí. Pro širší přehled o pilotování bez agentury si taky přečti našeho průvodce řízením Google Ads bez agentury.

Co Google Ads Script umí (a neumí)?

Google Ads Scripts je JavaScript hostovaný a spouštěný Googlem na jejich infrastruktuře, s nativním přístupem k objektům Google Ads účtu přes wrapped API. Žádný Node server k udržování, žádný OAuth klíč ke správě, žádný externí cron k pronájmu. Napíšeš main() funkci, vložíš kód do Scripts rozhraní účtu, autorizuješ povinné permise a Google ji za tebe spouští — v preview režimu (dry-run) nebo na cron schedule (hodinový, denní, týdenní). Je to zdarma a běží to na Google serverech.

Use cases, kde Scripts září: monitoring (spend alerty, anomálie, 404), lehká automatizace (přidávání vyloučených, pauzování low-CVR klíčových slov), custom reporting (týdenní digest emailem, Sheets export), naplánované audity (chybějící rozšíření, rozbitý tracking, padající QS). Jakýkoli opakující se a omezený ops úkol — čti staty, dělej jednoduché rozhodnutí, pošli alert nebo modifikuj entitu — je ideální kandidát.

Případy, kde je Scripts nedostatečný: hluboká statistická analýza (žádné scientific libs jako numpy), third-party npm závislosti (nemožné nainstalovat), sub-secondové real-time pilotování (minimum 1 spuštění za hodinu), workflows přesahující 30 minut (hard timeout). Pro tyto případy přepni na Google Ads API backend (Python, Go) nebo na pilotní SaaS pokrývající monitoring + alerty + actions infru bez kódu.

Klíčový insight :

napříč účty, které pozorujeme, účty s 5+ aktivními skripty utrácejí v průměru 18-26 % méně v promrhaném rozpočtu (per zralost) (parazitní search termy, nekonzistentní bidy, neodhalené 404) než účty bez automatizace. ROI 2-3 hodinové investice na instalaci stacku níže se měří v týdnech, ne měsících.

Google Ads Script workflow — cron, pull, decision, actionCron schedulehodinový / denní / týdenníPull dataAdsApp.currentAccount()Rozhodnutíif / else, prahyAlertemail, Slack, webhookAkcevyloučené, pause, bid

Technická omezení k zapamatování: 30minutový timeout per run, denní API kvóta na bulk mutations, minimální frekvence 1 spuštění za hodinu, žádný npm balíček (vše musí být čistě ES5+ JavaScript Rhino-kompatibilní) a mírně proprietární syntax na AdsApp objektech. Nic blokujícího pro 10 skriptů níže, ale měj na paměti, pokud designuješ custom skript, který musí zpracovávat velký katalog. Pro workflows, které tato omezení překračují, oficiální Google Ads API (Python, Java, Go) zůstává backend fallback.

Celkový odhad: 10 až 15 hodin týdně ušetřených, pokud 10 skriptů běží paralelně, na průměrném účtu (3-8 aktivních kampaní). Je to ekvivalent třetiny junior ops full-time — za 3 hodiny iniciální instalace.

Jak automaticky detekovat anomálii výdajů?

Skript, který detekuje pod hodinou abnormální spike výdajů — budget leak, bidding bug, bot útok, nebo jednoduše špatně předvídaný sezónní posun. Porovnáváme aktuální hodinový výdaj s rolling 7denním průměrem, spustíme alert, pokud přesáhne práh (zde 1,5× průměr). Jemnější verze: spočti standardní odchylku, alertuj nad 2σ.

Use case: jakýkoli účet s denním rozpočtem > 100 $. Kritické pro sezónně-peak e-commerce a pro SaaS, kde feed error dokáže zničit rozpočet za 4 hodiny.

function main() {
  var today = AdsApp.currentAccount().getStatsFor("TODAY").getCost();
  var avg7d = AdsApp.currentAccount().getStatsFor("LAST_7_DAYS").getCost() / 7;
  if (today > avg7d * 1.5) {
    MailApp.sendEmail(
      "ops@example.com",
      "[SPEND ALERT] Anomálie detekována",
      "Dnes: " + today.toFixed(2) + "€ vs 7d průměr: " + avg7d.toFixed(2) + "€"
    );
  }
}

Schedule: hodinový. Čas ušetřený: kolem 1 hodiny týdně (žádné manuální dashboard kontroly každé ráno). Level-2 vylepšení: nahraď 1,5× práh reálným výpočtem standardní odchylky za 30 dní pro vyhnutí se false positives spojeným s end-of-month spikes.

Jak automaticky přidávat vyloučená ze search termů?

Skript, který skenuje search termy posledních 30 dní a automaticky přidává jako vyloučené ty, co stojí víc než $X s 0 konverzemi. Okamžitá ziskovost: v našich auditech je to v průměru 8 až 15 % Search rozpočtu, co teče na out-of-scope dotazy. Skript nenahrazuje týdenní manuální review — zachytává nejhorší offendry okamžitě.

Use case: Search účty s broad match nebo phrase match aktivním, diverzifikovaný katalog. Méně užitečné, pokud běžíš 100% exact match těsně zamčený.

function main() {
  var report = AdsApp.report(
    "SELECT search_term_view.search_term, metrics.cost_micros, metrics.conversions " +
    "FROM search_term_view WHERE segments.date DURING LAST_30_DAYS " +
    "AND metrics.cost_micros > 20000000 AND metrics.conversions = 0"
  );
  var rows = report.rows();
  var campaign = AdsApp.campaigns().withIds(["123456789"]).get().next();
  while (rows.hasNext()) {
    var r = rows.next();
    campaign.createNegativeKeyword('[' + r["search_term_view.search_term"] + ']');
  }
}

Schedule: denní. Čas ušetřený: kolem 2 hodin týdně (žádný manuální hon na parazitní search termy). Nezbytný guardrail: loguj seznam přidaných vyloučených na každém runu a wrapni createNegativeKeyword v try/catch — bug tady dokáže negativovat zkonvertované dotazy, pokud invertneš operátor.

Skript 3 · Jak nastavit Quality Score decay alert?

Skript, který exportuje denně Quality Score tvých top klíčových slov do Google Sheetu, porovnává se skóre předchozího týdne a alertuje, pokud klíčové slovo klesne o víc než 1 bod. Esenciální pro reakci, než CPC exploduje — QS jdoucí z 8 na 6 zvyšuje průměrnou CPC o 40 až 60 %. Pro hlubší ponor do mechaniky Quality Score viz náš checklist auditu Google Ads.

Use case: zralé Search účty s 50+ aktivními klíčovými slovy. Umožňuje rychle identifikovat degradující landing page nebo reklamu ztrácející relevanci.

function main() {
  var sheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/XXX").getActiveSheet();
  var keywords = AdsApp.keywords()
    .withCondition("Status = ENABLED")
    .withCondition("Impressions > 100")
    .forDateRange("LAST_7_DAYS").get();
  while (keywords.hasNext()) {
    var kw = keywords.next();
    sheet.appendRow([new Date(), kw.getText(), kw.getQualityScore()]);
    // Porovnej vs hodnotu D-7 zde, alertuj, pokud pokles > 1 bod
  }
}

Schedule: denní. Čas ušetřený: kolem 45 minut týdně, ale hlavně prevence ztráty rozpočtu: reakce za 24 h na klesajícím QS se vyhne 2 týdnům placení nafouknuté CPC.

Jak monitorovat budget pacing celoročně?

Skript, který porovnává kumulativní výdaj měsíce s prorata teoretickým rozpočtem (aktuální den ÷ dní v měsíci × měsíční rozpočet) a spouští alert, pokud delta překročí ±15 %. Underspend = kampaně škrcené příliš nízkými bidy nebo špatně dimenzovaným denním rozpočtem; overspend = agresivní pacing, který spálí rozpočet uprostřed měsíce. Oba scénáře stojí draho. Viz taky náš dedikovaný průvodce Google Ads budget pacingem.

Use case: všechny účty s fixním měsíčním rozpočtem (agentury s monthly-retained klienty, interní marketingová oddělení s capovaným envelopem).

function main() {
  var MONTHLY_BUDGET = 10000; // € — k nakonfigurování
  var now = new Date();
  var dayOfMonth = now.getDate();
  var daysInMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();
  var expected = MONTHLY_BUDGET * (dayOfMonth / daysInMonth);
  var actual = AdsApp.currentAccount().getStatsFor("THIS_MONTH").getCost();
  var delta = (actual - expected) / expected;
  if (Math.abs(delta) > 0.15) {
    MailApp.sendEmail("ops@example.com", "[PACING] Delta " + (delta * 100).toFixed(0) + "%",
      "Utraceno: " + actual + "€ vs očekáváno: " + expected.toFixed(0) + "€");
  }
}

Schedule: denní (konec dne). Čas ušetřený: kolem 1h30 týdně, plus bezpečnost vyhnutí se trapnému ročnímu budget overrun na finance straně.

Skript 5 · Jak detekovat únavu ad copy (klesající CTR)?

Skript, který detekuje reklamy, jejichž CTR za posledních 7 dní klesne o víc než 25 % vs CTR za posledních 30 dní. Klasický symptom kreativní únavy: tvoje audience viděla reklamu příliš mnohokrát, scrolluje bez kliku. Reakce: refresh copy, otestuj nový headline, rotuj RSA assets.

Use case: budget-scaling účty, Display retargeting, always-on kampaně na stejné audienci. Neužitečné na ultra-diverzifikované cold akvizici.

function main() {
  var ads = AdsApp.ads().withCondition("Status = ENABLED").get();
  while (ads.hasNext()) {
    var ad = ads.next();
    var ctr7 = ad.getStatsFor("LAST_7_DAYS").getCtr();
    var ctr30 = ad.getStatsFor("LAST_30_DAYS").getCtr();
    if (ctr30 > 0 && ctr7 < ctr30 * 0.75) {
      Logger.log("FATIGUE: ad " + ad.getId() + " | 7d=" + ctr7 + " | 30d=" + ctr30);
      // Volitelně: olabeluj reklamu "to-refresh"
    }
  }
}

Schedule: týdenní. Čas ušetřený: kolem 1 hodiny týdně na manuálním reviewu ad statů, a hlavně dřívější detekce, která se vyhne 2-3 týdnům nízké CTR.

Skript 6 · Jak zachytit anomálii konkurenčního bidu (top IS klesla)?

Skript, který sleduje tvůj Impression Share (top a absolute top) na tvých core kampaních a alertuje, pokud ztratíš víc než 10 bodů za 24 h. Typický signál: konkurent právě boostnul své bidy, nebo nový hráč zaujal pozici. Možná rychlá reakce: uprav svůj Target CPA, pushni diferencující asset, aktivuj competitive sitelink.

Use case: konkurenční vertikály (pojištění, zdravotní pojištění, B2B SaaS, fashion e-commerce). Méně kritické v low-competition nikách.

function main() {
  var campaigns = AdsApp.campaigns().withCondition("Status = ENABLED").get();
  while (campaigns.hasNext()) {
    var c = campaigns.next();
    var statsYd = c.getStatsFor("YESTERDAY");
    var stats7d = c.getStatsFor("LAST_7_DAYS");
    var isYd = statsYd.getSearchImpressionShare();
    var is7d = stats7d.getSearchImpressionShare();
    if (is7d > 0 && (is7d - isYd) > 0.10) {
      MailApp.sendEmail("ops@example.com", "[IS DROP] " + c.getName(),
        "IS klesla z " + (is7d * 100).toFixed(0) + "% na " + (isYd * 100).toFixed(0) + "%");
    }
  }
}

Schedule: denní. Čas ušetřený: kolem 1 hodiny týdně aktivního konkurenčního monitoringu, nahrazeného pasivním alertem.

Jak detekovat 404 landing pages v reklamách?

Skript, který fetchne HTTP GET na každou final URL aktivních reklam, zkontroluje status code a alertuje okamžitě, pokud URL vrátí 404, 500 nebo broken redirect. Platit za poslání trafficu na rozbitou stránku je nejvíc ponižující chyba kampaně. V praxi 3 % auditovaných účtů má alespoň jednu permanentně aktivní 404 URL, často po redesignu nebo CMS změně.

Use case: e-commerce s product rotací (stock-outs, end-of-collection), recentně migrované weby, multi-sites s dynamickými URL.

function main() {
  var ads = AdsApp.ads().withCondition("Status = ENABLED").get();
  var broken = [];
  while (ads.hasNext()) {
    var ad = ads.next();
    var url = ad.urls().getFinalUrl();
    if (!url) continue;
    try {
      var resp = UrlFetchApp.fetch(url, { muteHttpExceptions: true, followRedirects: false });
      if (resp.getResponseCode() >= 400) broken.push(url + " → " + resp.getResponseCode());
    } catch (e) { broken.push(url + " → FETCH ERROR"); }
  }
  if (broken.length) MailApp.sendEmail("ops@example.com", "[404] Rozbité landing pages", broken.join("\n"));
}

Schedule: hodinový, pokud e-commerce, denní jinak. Čas ušetřený: kolem 2 hodin týdně, plus přímá úspora na rozpočtu utraceném za rozbitou stránku (která může dosáhnout stovek dolarů za den).

Skript 8 · Jak odhalit conversion tracking drift (pokles ratu)?

Skript, který spočítá conversion rate za posledních 24 hodin vs 14denní průměr, a alertuje, pokud rate klesne o víc než 40 % bez objemového vysvětlení. Hlavní symptom: rozbitý tracking — GTM tag, který už neodpaluje, špatně nakonfigurovaný consent mode, odpojená GA4. Absolutní noční můra, když Smart Bidding ztratí svůj conversion signál. Pro kompletní tracking re-audit viz náš průvodce conversion trackingu.

Use case: všechny účty s aktivním Smart Biddingem. Kritické vždy, když je naplánovaný technický redesign na webu.

function main() {
  var acct = AdsApp.currentAccount();
  var clicks1 = acct.getStatsFor("YESTERDAY").getClicks();
  var conv1 = acct.getStatsFor("YESTERDAY").getConversions();
  var clicks14 = acct.getStatsFor("LAST_14_DAYS").getClicks();
  var conv14 = acct.getStatsFor("LAST_14_DAYS").getConversions();
  if (clicks1 === 0 || clicks14 === 0) return;
  var rate1 = conv1 / clicks1;
  var rate14 = conv14 / clicks14;
  if (rate14 > 0 && rate1 < rate14 * 0.6) {
    MailApp.sendEmail("ops@example.com", "[TRACKING] Conversion drift",
      "CVR 24h=" + (rate1 * 100).toFixed(2) + "% vs 14d=" + (rate14 * 100).toFixed(2) + "%");
  }
}

Schedule: denní. Čas ušetřený: kolem 1 hodiny týdně, ale hlavně velká úspora na Smart Biddingu jdoucím stranou 7 dní před manuální detekcí.

Skript 9 · Jak auditovat chybějící rozšíření (sitelinky)?

Skript, který listuje všechny aktivní Search kampaně a ověřuje přítomnost klíčových rozšíření: sitelinky (minimum 4), callouts (minimum 4), structured snippets, business info. Alert, pokud kampaň nemá žádná rozšíření nebo méně než minimum. Rozšíření boostují CTR o 10 až 15 % v průměru — zapomenout na ně je čisté plýtvání. Dokumentace na Google Ads support na rozšířeních.

Use case: agenturní MCC s 20+ účty k dohledu, nebo marketingové týmy pravidelně launchující nové kampaně bez striktního procesu.

function main() {
  var missing = [];
  var campaigns = AdsApp.campaigns().withCondition("Status = ENABLED").get();
  while (campaigns.hasNext()) {
    var c = campaigns.next();
    var sitelinks = c.extensions().sitelinks().get().totalNumEntities();
    var callouts = c.extensions().callouts().get().totalNumEntities();
    if (sitelinks < 4 || callouts < 4) {
      missing.push(c.getName() + " → sitelinks=" + sitelinks + ", callouts=" + callouts);
    }
  }
  if (missing.length) MailApp.sendEmail("ops@example.com", "[EXT] Chybějící rozšíření", missing.join("\n"));
}

Schedule: týdenní. Čas ušetřený: kolem 30 minut týdně manuálního auditu nahrazeného, ale hlavně systematické pokrytí zajišťující, že žádná nová kampaň nezůstane bez rozšíření.

Skript 10 · Jak posílat týdenní performance digest email?

Skript, který agreguje každé pondělí ráno klíčové metriky uplynulého týdne (výdaj, kliky, konverze, CTR, CPA, ROAS) a posílá summary HTML email stakeholderům. Konec 45 minut každé pondělí na buildování weekly PowerPointu. Bonus: přidej week-over-week variation, highlightni top/flop kampaně, top 3 konvertující search termy.

Use case: všechny struktury s opakujícím se týdenním reportingem (agentura, in-house, freelancer). Nahrazuje manuální deliverable 30 až 60 minut.

function main() {
  var s = AdsApp.currentAccount().getStatsFor("LAST_7_DAYS");
  var prev = AdsApp.currentAccount().getStatsFor("LAST_14_DAYS");
  var html = "<h2 data-speakable>Týdenní digest</h2>" +
    "<p>Výdaj: " + s.getCost().toFixed(0) + "€</p>" +
    "<p>Konv: " + s.getConversions() + "</p>" +
    "<p>CPA: " + (s.getCost() / Math.max(s.getConversions(), 1)).toFixed(2) + "€</p>" +
    "<p>CTR: " + (s.getCtr() * 100).toFixed(2) + "%</p>";
  MailApp.sendEmail({
    to: "team@example.com",
    subject: "[Weekly digest] Google Ads — týden " + new Date().toLocaleDateString(),
    htmlBody: html
  });
}

Schedule: týdenní, pondělí 8:00. Čas ušetřený: kolem 1h30 týdně a zaručená pravidelnost (žádné digesty zapomenuté v rušných týdnech).

Fatální chyba, které se vyhnout :

Google Ads Script bez error handlingu může spustit masivní akci v případě API bugu — představ si 500 broad vyloučených přidaných napříč celou tvou strukturou, protože řádek 12 vrátil undefined. Absolutní pravidlo: jakákoli mutace entity (add, set, pause, remove) musí být wrappovaná v try/catch s error notifikací a entity modifikačním capem per run (např. max 50 vyloučených přidaných/run).

Těchto 10 skriptů pokrývá 90 % klasických automatizačních potřeb. Pokud chceš bohatší monitoring vrstvu (multi-criteria statistická anomaly detekce, Slack/webhook alerty, hluboká historizace, multi-account dashboardy), většina těchto skriptů je už zabudovaná v SteerAds — náš modul Monitoring běží 24/7 bez požadavku na maintenance kódu, Auto-optimization přidává automatické akce (vyloučená, pacing, budget redistrib) a náš bezplatný audit ukazuje za 72 h skripty k prioritní instalaci na tvém účtu. Pro strukturálnější scaling navaž na náš kompletní průvodce Performance Max.

Zdroje

Oficiální zdroje použité v tomto průvodci:

FAQ

Musíš umět kódovat pro použití Google Ads Scripts?

Základní JavaScript stačí pro instalaci a přizpůsobení skriptů, které poskytujeme. AdsApp.* objekty jsou dobře dokumentované, kompilátor zabudovaný v Google Ads rozhraní vyplývá errors před spuštěním a většina užitečných skriptů se vejde do 40 až 120 řádků. Musíš umět přečíst funkci, pochopit for loop a manipulovat s JSON objekty — víc nic. Pro netechnické týmy obezřetný copy-paste z našeho repa a 2-3 preview testy (bez reálného spuštění) ti umožní nainstalovat monitoring skript pod 15 minut. Pro vývoj custom skriptu s komplexní byznys logikou je junior vývojář stále preferovatelný.

Jsou Google Ads Scripts bezpečné?

Ano, na execution straně — Google je spouští na vlastní sandboxované infrastruktuře, nemáš žádný server k udržování a žádné credentials k hostování. Hlavní riziko na code straně: bugový skript, který masivně mění účet (např. pauzne všechny kampaně, mění všechny bidy) bez error handlingu. Vždy testuj v preview režimu před scheduling, wrapni write operace v try/catch s error notifikací a přidej guardrails (např. limituj počet entit modifikovaných na run). Na našem interním SteerAds benchmarku 14 % velkých Google Ads incidentů narážejících na klienty v auditu je vázáno na skript bez guardrails.

Kolik skriptů můžeš spustit na Google Ads účtu?

Na úrovni jednotlivého účtu Google povoluje až 250 aktivních skriptů, ale narazíš na strop užitečnosti dlouho předtím — kolem deseti dobře navržených skriptů pokrývá 90 % automatizačních potřeb. Reálné kvóty, které tě budou blokovat první: 30minutový execution maximum na skript, denní API operations limit (bulk mutations) a maximální frekvence 1 spuštění za hodinu pro hodinové skripty. MCC (manager účet) může spustit skript iterující napříč desítkami child účtů v jednom runu, což mění hru pro agentury. Začni malý, měř dopad, pak škáluj.

Skripty vs SaaS nástroj (jako SteerAds): co vybrat?

Oba jsou komplementární. Skripty září na one-off, hyper-custom akcích, kde už máš přesnou byznys logiku k zakódování — SaaS nikdy nereprodukuje tvoje in-house exclusion pravidlo. SaaS jako SteerAds pokrývá generickou infrastrukturu (24/7 monitoring, multi-channel alerty, statistická anomaly detekce, automatické audity, multi-account dashboardy, hluboká historizace) bez požadavku na maintenance kódu. Na našem interním SteerAds benchmarku účty kombinující 2-3 byznys-custom skripty + pilotní SaaS šetří 10 až 15h/týdně, vs 4-5h u těch jen se skripty. Otázka není „co", ale „kam nastavit kurzor".

Ready to optimize your campaigns?

Start a free audit in 2 minutes and discover the ROI potential of your accounts.

Start my free audit

Free audit — no credit card required

Keep reading