Seit 1999: 27 Jahre IT & Online

Dein erstes Google Ads Script

Ein wiederkehrender Handgriff in Google Ads, ein paar Zeilen JavaScript und ein Zeitplan: So baust du deine erste eigene Automatisierung, auch ohne fundierte Programmierkenntnisse.

Google Ads Script-Editor mit dem Placement Excluder, daneben die Bestätigungsmail über drei neu ausgeschlossene Placements

Filter, automatisierte Regeln und Bulk-Uploads bringen dich in Google Ads schon ziemlich weit. Irgendwann stößt du aber auf einen Handgriff, den du jede Woche wiederholst und für den es keine fertige Funktion gibt. Genau dafür gibt es Google Ads Scripts. In diesem Artikel bauen wir gemeinsam ein komplettes Script: von der Idee über die Recherche bis zum automatischen Zeitplan. JavaScript-Grundkenntnisse helfen, sind aber keine Voraussetzung.

Google Ads Scripts kurz erklärt

Google Ads Scripts sind kleine JavaScript-Programme, die direkt in deinem Google-Ads-Konto laufen. Sie lesen Daten aus, ändern Kampagnen, schreiben in Google Sheets oder verschicken E-Mails, und das auf Wunsch stündlich, täglich oder wöchentlich.

Auf der Developers-Seite zu Google Ads Scripts findest du eine Einführung (Guides), die vollständige Referenz (Reference), viele Code-Beispiele (Examples) und einige fertige Lösungen (Solutions). Die fertigen Lösungen lassen sich meist über ein paar Einstellungen an dein Konto anpassen.

Oft liegen die Vorlagen aber zu weit weg von dem, was du eigentlich brauchst. Dann lohnt es sich, ein eigenes Script auf der grünen Wiese zu schreiben.

Das Problem: Display-Anzeigen auf unpassenden Websites

Google legt die Ausrichtung nach Sprache und Standort relativ großzügig aus. Ob jemand eine Sprache spricht, leitet Google unter anderem aus Browser-Einstellungen, dem Standort und den Spracheinstellungen bei YouTube ab.

Die Folge: Selbst bei eng gefasster regionaler Ausrichtung landen Display-Anzeigen auf fremdsprachigen Websites mit ausländischen Domainendungen. In unserem Fall lieferten diese Placements erwartungsgemäß schlechte Ergebnisse.

Die Idee: aus dem Alltag im Account Management

Der Anstoß für eine Automatisierung kommt fast immer aus dem operativen Tagesgeschäft. Robert, Account Manager bei adtraffic, erzählt im Interview, wie aus seinem konkreten Problem das Script aus diesem Artikel entstanden ist.

Richard: Robert, wie kam es zur Idee, Placements automatisch auszuschließen?

Robert: Aus dem täglichen Doing heraus. Beim Reporting neuer Display-Kampagnen ist mir aufgefallen, dass im Bericht „Wo Anzeigen ausgeliefert wurden“ auffällig viele unpassende Placements standen. Schon auf der ersten Seite fanden sich jede Menge Domains mit Endungen wie .ru, .pl oder .hu, die an der eigentlichen Zielgruppe zum großen Teil vorbeigehen.

Richard: Gab es neben den Domainendungen weitere Hinweise, dass diese Placements nicht passen?

Robert: Ja, die Kennzahlen. Ein Placement tauchte in mehreren Display-Kampagnen immer wieder auf, jedes Mal mit ähnlich verdächtigen Werten. Bei einer CTR von über 50 % im Display-Netzwerk läuten sofort die Alarmglocken. Das Placement musste raus.

Richard: Wie ging es dann weiter?

Robert: Bei der Menge an potenziell ungeeigneten Placements kam schnell die Frage auf, ob sich das nicht automatisieren lässt. Jedes Placement einzeln einzutragen und zu bestätigen war ziemlich aufwendig. In meiner naiven Vorstellung konnte es nicht so schwer sein, Google zu sagen: Bitte nur Placements mit .de, .org oder .com. Leider lassen sich unerwünschte Domainendungen mit den Bordmitteln von Google nicht pauschal ausschließen.

Richard: Und dann ging es an die Recherche und ans gemeinsame Scripten?

Robert: Genau. Die Idee war schnell geboren und musste „nur“ noch in ein Script gepackt werden. Dass sich das fertige Script auch in anderen Kundenkonten einsetzen lässt, war eine schöne zusätzliche Motivation.

Richard: Wie zufrieden bist du mit dem Ergebnis?

Robert: Sehr zufrieden. Vor allem, weil auf die erste Version schnell eine zweite folgte: Nach etwa einer Woche im Einsatz zeigte sich, dass es auch erwünschte Placements gibt, die nicht auf die vertrauten Endungen enden. Ein schönes Beispiel ist „bedienungsanleitu.ng“. Also brauchten wir eine Whitelist, um solche Placements dauerhaft vom automatischen Ausschluss auszunehmen.

Richard: Deine drei wichtigsten Learnings?

Robert: Erstens: Google Ads Scripts sind eine interessante Mischung aus gesundem Menschenverstand und purer Logik. Zweitens: JavaScript-Kenntnisse machen es leichter, aber dank der ausführlichen Dokumentation von Google ist man auch ohne sie nicht aufgeschmissen. Drittens: Scripts wollen sich von selbst weiterentwickeln, man muss ihnen nur ein bisschen dabei helfen.

Vom manuellen Prozess zum Plan

Bisher: Unerwünschte Placements wurden in der Ansicht „Wo Anzeigen ausgeliefert wurden“ per Filter ausgewählt und als Ausschluss in der jeweiligen Kampagne eingetragen. Direkt in eine gemeinsame Ausschlussliste übernehmen lassen sie sich aus dieser Ansicht nicht, sie müssten kopiert oder abgetippt werden.

Ziel: Weil die marktfremden Placements für mehrere oder sogar alle Kampagnen sinnvolle Ausschlüsse sind, sollen sie automatisch in einer gemeinsamen Placement-Ausschlussliste landen, die für alle betroffenen Kampagnen gilt.

Vorbereitung: Die Ausschlussliste legen wir einmalig von Hand an und verknüpfen sie mit den Kampagnen. Das ließe sich auch automatisieren, lohnt sich für eine einmalige Aufgabe aber nicht.

Das Script selbst erledigt dann drei Schritte:

  1. Unerwünschte Placements erkennen: eine Liste aller Placements erstellen, die als Ausschluss infrage kommen.
  2. In der Ausschlussliste ergänzen: alle Placements hinzufügen, die noch nicht ausgeschlossen sind und nicht auf der Whitelist stehen.
  3. Bestätigung per E-Mail schicken: den zuständigen Account Manager informieren, welche Placements neu dazugekommen sind.

Die Recherche: Was die Dokumentation hergibt

Für jeden Schritt brauchen wir eine passende Funktion oder Abfrage. Deshalb schauen wir zuerst in die Dokumentation, statt sofort Code zu schreiben.

Das Script anlegen

Die Scripts findest du in Google Ads unter Tools › Bulk-Aktionen › Skripts. Über den blauen Plus-Button legst du ein neues Script an.

Beim ersten Mal fordert das Script eine Autorisierung an, damit es später im Namen deines Nutzers Änderungen vornehmen darf. Nach dem Klick auf „Autorisieren“ wählst du dein Google-Konto aus und erlaubst die angefragten Zugriffe. Gib dem Script gleich einen sprechenden Namen, zum Beispiel „Placement Excluder“.

Das Script Schritt für Schritt

Wir bauen das Script aus mehreren kleinen Funktionen. Jede erledigt genau eine Aufgabe, die Hauptfunktion main() ruft sie der Reihe nach auf. So bleibt der Code lesbar und du kannst einzelne Teile später wiederverwenden.

Einstellungen am Anfang

Alles, was du pro Konto anpassen musst, steht ganz oben. So musst du später nicht im Code suchen.

const SPREADSHEET_URL = 'https://docs.google.com/spreadsheets/d/DEINE-SHEET-ID/edit';
const SHEET_NAME = 'placements';
const EXCLUSION_LIST_NAME = 'Globale Placement-Ausschlüsse';
const EMAIL_RECIPIENTS = 'name@example.com';

Unerwünschte Placements abfragen

Die erste Funktion liefert eine sortierte Liste aller Placements, die als Ausschluss infrage kommen. Die Abfrage durchsucht alle aktiven und pausierten Display-Kampagnen, deren Name mit „GDN_“ beginnt, und holt alle Placements vom Typ Website, die nicht auf eine der erlaubten Endungen enden.

function queryPlacementUrls() {
  const query =
    'SELECT group_placement_view.target_url ' +
    'FROM group_placement_view ' +
    "WHERE campaign.status IN ('ENABLED', 'PAUSED') " +
    "AND campaign.advertising_channel_type = 'DISPLAY' " +
    "AND group_placement_view.placement_type = 'WEBSITE' " +
    "AND group_placement_view.target_url NOT REGEXP_MATCH '.*[.](de|at|ch|com|net|org|info)' " +
    "AND campaign.name REGEXP_MATCH 'GDN_.*'";

  const urls = new Set();
  const rows = AdsApp.search(query);
  while (rows.hasNext()) {
    urls.add(rows.next().groupPlacementView.targetUrl);
  }
  return [...urls].sort();
}

Ein paar Details dazu:

Die Ausschlussliste finden

Diese kleine Hilfsfunktion sucht die Ausschlussliste anhand ihres Namens. Wir brauchen sie zweimal: zum Auslesen und zum Ergänzen. Gibt es die Liste nicht, bricht das Script mit einer verständlichen Meldung ab.

function getExcludedPlacementList(listName) {
  const lists = AdsApp.excludedPlacementLists().get();
  while (lists.hasNext()) {
    const list = lists.next();
    if (list.getName() === listName) {
      return list;
    }
  }
  throw new Error('Ausschlussliste "' + listName + '" nicht gefunden.');
}

Bereits ausgeschlossene Placements laden

Bevor wir etwas ergänzen, holen wir alle Placements, die schon auf der Liste stehen. So fügen wir nichts doppelt hinzu.

function getExcludedPlacements(listName) {
  const excluded = [];
  const placements = getExcludedPlacementList(listName).excludedPlacements().get();
  while (placements.hasNext()) {
    excluded.push(placements.next().getUrl());
  }
  return excluded.sort();
}

Die Whitelist aus Google Sheets laden

Für erwünschte Placements mit ungewöhnlicher Endung legen wir ein Google Sheet an: ein Tabellenblatt namens „placements“, in Spalte A eine Domain pro Zeile. Die Funktion liest die Spalte ein und ignoriert leere Zeilen.

function loadWhitelist(spreadsheetUrl, sheetName) {
  const sheet = SpreadsheetApp.openByUrl(spreadsheetUrl).getSheetByName(sheetName);
  const lastRow = sheet.getLastRow();
  if (lastRow === 0) {
    return [];
  }
  return sheet.getRange(1, 1, lastRow, 1).getValues()
    .map(row => String(row[0]).trim().toLowerCase())
    .filter(url => url !== '');
}

Neue Ausschlüsse ermitteln

Jetzt bringen wir die drei Listen zusammen:

Jedes Placement wird zuerst gegen die Whitelist geprüft. Steht es dort, wird es übersprungen und für die Bestätigungsmail mitgezählt. Ist es noch nicht ausgeschlossen, kommt es auf die Liste der neuen Ausschlüsse.

function getToBeExcludedPlacements(placementUrls, excludedPlacements, whitelist) {
  const toExclude = [];
  let numWhitelisted = 0;
  for (const url of placementUrls) {
    if (whitelist.includes(url)) {
      numWhitelisted++;
    } else if (!excludedPlacements.includes(url)) {
      toExclude.push(url);
    }
  }
  return { toExclude: toExclude, numWhitelisted: numWhitelisted };
}

Ausschlüsse anlegen

Die neuen Placements hängen wir in einem Rutsch an die Ausschlussliste an. Ist nichts Neues dabei, macht die Funktion einfach nichts.

function addExcludedPlacements(listName, urls) {
  if (urls.length === 0) {
    return;
  }
  getExcludedPlacementList(listName).addExcludedPlacements(urls);
}

Bestätigung per E-Mail

Damit du mitbekommst, was passiert ist, schickt das Script eine kurze Mail mit allen neu ausgeschlossenen Placements. Der Kontoname im Betreff hilft, wenn das Script in mehreren Konten läuft.

function sendConfirmationEmail(listName, result) {
  const subject = 'Placement Excluder // ' + AdsApp.currentAccount().getName();
  const body =
    result.toExclude.length + ' Placement(s) in der Ausschlussliste "' + listName + '" ergänzt.\n' +
    result.numWhitelisted + ' Placement(s) übersprungen (Whitelist).\n\n' +
    result.toExclude.join('\n');
  console.log(body);
  MailApp.sendEmail(EMAIL_RECIPIENTS, subject, body);
}

Die Hauptfunktion

main() ist der Einstiegspunkt, den Google Ads bei jedem Lauf aufruft. Sie verbindet alle Schritte:

function main() {
  const placementUrls = queryPlacementUrls();
  const excludedPlacements = getExcludedPlacements(EXCLUSION_LIST_NAME);
  const whitelist = loadWhitelist(SPREADSHEET_URL, SHEET_NAME);
  const result = getToBeExcludedPlacements(placementUrls, excludedPlacements, whitelist);
  addExcludedPlacements(EXCLUSION_LIST_NAME, result.toExclude);
  sendConfirmationEmail(EXCLUSION_LIST_NAME, result);
}

Das komplette Script in einem Stück kannst du hier herunterladen: placement-excluder.js. Trag oben deine eigenen Werte ein und kopiere den Inhalt in den Script-Editor.

Berechtigungen, Vorschau und Zeitplan

Für den Zugriff auf das Google Sheet und den Mailversand braucht das Script zusätzliche Berechtigungen. Google Ads fragt sie spätestens beim ersten Lauf ab, die Meldung erscheint am unteren Rand des Editors. Bestätige sie mit „Autorisieren“.

Bevor das Script echte Änderungen vornimmt, starte es einmal über Vorschau. Dabei läuft der komplette Code, Änderungen an der Ausschlussliste werden aber nur simuliert. Im Log siehst du, welche Placements ausgeschlossen würden. Passt alles, stellst du auf der Übersichtsseite in der Spalte „Häufigkeit“ den Zeitplan ein. In unserem Beispiel läuft das Script jeden Montag zwischen 7 und 8 Uhr.

Und was ist mit KI?

Vielleicht fragst du dich: Kann ich mir das nicht einfach von einem KI-Assistenten schreiben lassen? Teilweise ja. Aktuelle Modelle liefern für Google Ads Scripts heute deutlich brauchbareren Code als noch vor ein paar Jahren und sind eine gute Hilfe beim Verstehen und Erweitern.

Trotzdem greifen sie immer wieder auf veraltete Syntax zurück oder erfinden Methoden, die es so nicht gibt. Wenn du die Dokumentation und die Grundstruktur deines Scripts selbst kennst, erkennst du solche Fehler sofort. Unser Tipp: Bau dein erstes Script selbst und nimm die KI dann als Sparringspartner dazu.

Zusammenfassung

Hinter vielen wiederkehrenden Handgriffen in Google Ads steckt Potenzial für eine Automatisierung. Der Weg dorthin ist immer ähnlich: Problem beschreiben, in Schritte zerlegen, in der Dokumentation passende Funktionen suchen, kleine Funktionen bauen, in der Vorschau testen und per Zeitplan laufen lassen. Vielleicht hast du schon eine Idee für dein eigenes Script. Viel Spaß beim Ausprobieren und viel Erfolg mit deinem ersten Google Ads Script!

Dieser Artikel ist 2023 zuerst bei adtraffic erschienen und wurde für rsc24 überarbeitet. Der Code wurde dabei an die aktuelle Script-Umgebung angepasst.

Erstveröffentlichung: www.adtraffic.de

Zurück zur Übersicht