Skrypty Google Ads, które pilnują konta - alert budżetu, odrzucone reklamy i produkty, konflikty wykluczeń

Jak dodać skrypt w Google Ads i cztery krótkie przykłady, które wyślą Ci e-mail, gdy kampania przekroczy budżet, reklama zostanie odrzucona albo wykluczenie zablokuje słowo kluczowe.

19 października 2026 7 min czytania

Dawid Hepner - BoM Representative & Performance Ads Expert, Up Blue
Dawid HepnerBoM Representative & Performance Ads Expert
Z tego artykułu dowiesz się:
  • jak dodać, autoryzować i zaplanować skrypt w Google Ads,
  • jak napisać alert budżetu i alert odrzuconych reklam oraz produktów,
  • jak wykryć wykluczające słowa kluczowe, które blokują Twoje słowa kluczowe.

Skrypt Google Ads to krótki kod w JavaScripcie, który uruchamiasz na koncie według harmonogramu, np. co godzinę - może sam sprawdzić wydatki, odrzucone reklamy czy konflikty wykluczeń i wysłać Ci e-mail, gdy coś jest nie tak. Nie potrzebujesz serwera ani programisty na etacie. Poniżej pokazujemy, jak dodać skrypt, i cztery krótkie przykłady oparte na dokumentacji Google Ads Scripts.

Jak dodać skrypt w Google Ads

  1. Kliknij ikonę Narzędzia, w menu Działania zbiorcze wybierz Skrypty.
  2. Kliknij przycisk plusa, nadaj skryptowi nazwę i wklej kod do edytora.
  3. Kliknij Autoryzuj, a potem Zezwól - skrypt działa w imieniu Twojego konta Google.
  4. Kliknij Podgląd. Podgląd uruchamia skrypt bez wprowadzania zmian, a wynik zobaczysz w dzienniku.
  5. Gdy wszystko działa, zapisz skrypt i ustaw harmonogram ikoną ołówka w kolumnie Częstotliwość.

Według dokumentacji skrypty można uruchamiać co godzinę, codziennie, co tydzień albo co miesiąc. Pojedyncze wykonanie na koncie reklamodawcy może trwać maksymalnie 30 minut. Historię uruchomień i błędy sprawdzisz w Historii skryptów. Jeśli nie chcesz pisać kodu, przy dodawaniu skryptu możesz też zacząć od szablonu - Google udostępnia szablony m.in. w kategorii alertów.

Jak skrypty czytają dane

Wszystkie przykłady korzystają z metody AdsApp.search(), która przyjmuje zapytanie w języku zapytań Google Ads (GAQL). Nazwy pól w zapytaniu piszesz z podkreślnikami, np. campaign_budget.amount_micros, a w wynikach odczytujesz je w zapisie camelCase: row.campaignBudget.amountMicros. Kwoty są w mikrojednostkach, więc dzielisz je przez milion. E-mail wysyłasz metodą MailApp.sendEmail(). W przykładach podmień adres na swój.

1. Alert budżetu: kampania wydała dziś za dużo

Skrypt sprawdza dzisiejsze wydatki każdej włączonej kampanii i wysyła e-mail, gdy przekroczą 150% budżetu dziennego. Ustaw go na uruchamianie co godzinę.

const EMAIL = 'ty@twojafirma.pl';
const PROG = 1.5;

function main() {
  const rows = AdsApp.search(
    'SELECT campaign.name, ' +
    'metrics.cost_micros, ' +
    'campaign_budget.amount_micros ' +
    'FROM campaign ' +
    "WHERE campaign.status = 'ENABLED' " +
    'AND segments.date DURING TODAY');
  const alerty = [];
  while (rows.hasNext()) {
    const r = rows.next();
    const koszt =
      Number(r.metrics.costMicros) / 1e6;
    const budzet =
      Number(r.campaignBudget.amountMicros) / 1e6;
    if (budzet > 0 && koszt > budzet * PROG) {
      alerty.push(r.campaign.name + ': ' +
        koszt.toFixed(2) + ' / ' +
        budzet.toFixed(2));
    }
  }
  if (alerty.length) {
    MailApp.sendEmail(EMAIL,
      'Alert budżetu ' +
      AdsApp.currentAccount().getCustomerId(),
      alerty.join('\n'));
  }
}

Dlaczego 150%, a nie 100%? Google Ads może w jednym dniu wydać do 2 razy więcej niż średni budżet dzienny i to nie jest błąd - wyjaśniamy to w tekście dlaczego Google Ads wydaje więcej niż budżet dzienny. Próg dobierz do siebie. Przy budżecie wspólnym skrypt porównuje koszt kampanii z kwotą całej puli. Pamiętaj też, że statystyki w Google Ads mogą spływać z opóźnieniem.

2. Odrzucone reklamy

Odrzucona reklama nie wyświetla się nigdzie, a powiadomienie łatwo przeoczyć. Ten fragment znajduje włączone reklamy we włączonych kampaniach, których stan zatwierdzenia to DISAPPROVED:

const rows = AdsApp.search(
  'SELECT campaign.name, ad_group.name, ' +
  'ad_group_ad.ad.id ' +
  'FROM ad_group_ad ' +
  'WHERE ad_group_ad.policy_summary' +
  ".approval_status = 'DISAPPROVED' " +
  "AND ad_group_ad.status = 'ENABLED' " +
  "AND campaign.status = 'ENABLED'");
const lista = [];
while (rows.hasNext()) {
  const r = rows.next();
  lista.push(r.campaign.name + ' / ' +
    r.adGroup.name + ' / ' +
    r.adGroupAd.ad.id);
}

Listę wyślij e-mailem tak jak w pierwszym przykładzie. Jeśli chcesz wiedzieć także o reklamach z ograniczeniami, dodaj wartość APPROVED_LIMITED - reklama się wyświetla, ale nie wszędzie.

3. Produkty, które nie mogą wyświetlać się w reklamach

Zasób shopping_product pokazuje aktualny stan produktów w kampaniach produktowych i Performance Max - także tych, które jeszcze nie miały wyświetleń. Zapytanie bez filtra kampanii zwraca produkty z całego konta:

const rows = AdsApp.search(
  'SELECT shopping_product.item_id, ' +
  'shopping_product.title ' +
  'FROM shopping_product ' +
  "WHERE shopping_product.status " +
  "= 'NOT_ELIGIBLE'");

Stan NOT_ELIGIBLE oznacza, że produkt nie może wyświetlać się w reklamach, a ELIGIBLE_LIMITED - że wyświetla się z ograniczeniami. Pole shopping_product.issues zawiera listę problemów z linkiem do artykułu pomocy, który podpowiada, czy poprawka należy do Merchant Center, czy do Google Ads. Google zaznacza, że zmiany stanu mogą być widoczne dopiero po 24 godzinach. Najczęstsze przyczyny odrzuceń opisaliśmy w poradniku odrzucone produkty w Google Merchant Center.

4. Konflikty wykluczających słów kluczowych

Konflikt powstaje, gdy wykluczające słowo kluczowe w kampanii blokuje Twoje własne słowo kluczowe, np. wykluczenie „tanie” zablokuje słowo „tanie buty do biegania”. Skrypt pobiera wykluczenia kampanii, potem aktywne słowa kluczowe i porównuje je według typu dopasowania:

function main() {
  const neg = {};
  const n = AdsApp.search(
    'SELECT campaign.id, ' +
    'campaign_criterion.keyword.text, ' +
    'campaign_criterion.keyword.match_type ' +
    'FROM campaign_criterion ' +
    "WHERE campaign_criterion.type = 'KEYWORD' " +
    'AND campaign_criterion.negative = TRUE ' +
    "AND campaign.status = 'ENABLED'");
  while (n.hasNext()) {
    const r = n.next();
    const id = r.campaign.id;
    neg[id] = neg[id] || [];
    neg[id].push(r.campaignCriterion.keyword);
  }
  const k = AdsApp.search(
    'SELECT campaign.id, campaign.name, ' +
    'ad_group_criterion.keyword.text ' +
    'FROM ad_group_criterion ' +
    "WHERE ad_group_criterion.type = 'KEYWORD' " +
    'AND ad_group_criterion.negative = FALSE ' +
    "AND ad_group_criterion.status = 'ENABLED' " +
    "AND campaign.status = 'ENABLED'");
  const wynik = [];
  while (k.hasNext()) {
    const r = k.next();
    const kw = r.adGroupCriterion.keyword.text;
    (neg[r.campaign.id] || []).forEach(function (w) {
      if (blokuje(w, kw)) {
        wynik.push(r.campaign.name + ': ' +
          kw + ' / ' + w.text);
      }
    });
  }
  console.log(wynik.join('\n'));
}

function blokuje(w, kw) {
  const s = kw.toLowerCase().split(' ');
  const n = w.text.toLowerCase().split(' ');
  if (w.matchType === 'EXACT') {
    return s.join(' ') === n.join(' ');
  }
  if (w.matchType === 'PHRASE') {
    return (' ' + s.join(' ') + ' ')
      .indexOf(' ' + n.join(' ') + ' ') > -1;
  }
  return n.every(function (x) {
    return s.indexOf(x) > -1;
  });
}

Logika odpowiada temu, jak Google opisuje działanie wykluczeń: wykluczenie w dopasowaniu przybliżonym blokuje zapytanie, gdy zawiera ono wszystkie słowa wykluczenia w dowolnej kolejności, w dopasowaniu do wyrażenia - gdy zawiera je w tej samej kolejności, a w dopasowaniu ścisłym - gdy jest identyczne. To uproszczenie: skrypt nie sprawdza wykluczeń na poziomie grup reklam ani list wykluczających słów kluczowych, a słowa kluczowe w dopasowaniu przybliżonym mogą łapać zapytania, których nie da się przewidzieć z samego tekstu słowa.

Skrypt nie zastąpi człowieka

Alert mówi, że coś się stało, ale nie mówi, co z tym zrobić. Odrzuconą reklamę trzeba poprawić albo odwołać się od decyzji, a przekroczony budżet bywa po prostu dobrym dniem sprzedaży. Jeśli chcesz, żeby ktoś odbierał takie alerty i reagował na nie za Ciebie, zobacz, jak prowadzimy kampanie Google Ads.

Najczęściej zadawane pytania

Czy skrypty Google Ads są płatne?

Nie. Skrypty są funkcją konta Google Ads i nie wymagają dodatkowych opłat. Potrzebujesz tylko dostępu do konta, który pozwala na autoryzację skryptu.

Czy jeden skrypt może działać na kilku kontach?

Tak, jeśli dodasz go na koncie menedżera. Skrypty na koncie menedżera mogą przechodzić po kontach podrzędnych - przykłady z tego tekstu trzeba wtedy rozbudować o wybór kont.

Co się stanie, jeśli skrypt ma błąd?

Wykonanie zakończy się błędem, który zobaczysz w historii i dzienniku skryptu. Skrypty, które tylko czytają dane, nie zepsują kampanii - dlatego od nich warto zacząć.

Czytaj dalej