KI & Automation25 min Lesezeit2026-02-03

Google Ads Scripts: Automatisierung ohne Programmierkenntnisse (2026 Guide)

Mit Google Ads Scripts automatisierst du repetitive Aufgaben, erstellst Custom-Reports und optimierst deine Kampagnen rund um die Uhr. Dieser Guide zeigt dir alles von den Grundlagen bis zu fortgeschrittenen Scripts - auch ohne Programmiererfahrung.

Das Wichtigste in Kürze

  • Google Ads Scripts ermöglichen Automatisierung von zeitaufwändigen Aufgaben wie Reporting, Monitoring und Optimierung
  • Keine Programmierkenntnisse nötig: Mit KI-Tools wie ChatGPT kannst du maßgeschneiderte Scripts erstellen lassen
  • Scripts laufen automatisch nach Zeitplan und können dich bei Problemen sofort per E-Mail benachrichtigen
  • Von Budget-Monitoring bis Wettbewerber-Analyse: Die 10 wichtigsten Scripts für 2026 mit Code-Beispielen
  • Scripts sparen durchschnittlich 5-10 Stunden pro Woche bei der Account-Verwaltung

Was sind Google Ads Scripts?

Google Ads Scripts sind JavaScript-basierte Programme, die direkt in deinem Google Ads Account laufen und automatisch Aktionen ausführen können. Du kannst damit Daten auslesen, Änderungen vornehmen, Reports erstellen und dich bei bestimmten Ereignissen benachrichtigen lassen - alles automatisiert und ohne manuelle Eingriffe.

Das Besondere: Anders als externe Tools haben Scripts direkten Zugriff auf alle deine Account-Daten und können in Echtzeit reagieren. Sie laufen auf Googles eigenen Servern, sind kostenlos und erfordern keine zusätzliche Software. Kombiniert mit Agentic AI-Systemen entstehen so mächtige Automatisierungs-Workflows.

Definition

Google Ads Scripts sind JavaScript-Programme, die über die Google Ads Script API auf deinen Account zugreifen. Sie können Daten lesen, analysieren und automatisch Änderungen vornehmen - von einfachen Alerts bis zu komplexen Optimierungsroutinen.

Was können Google Ads Scripts?

FunktionBeschreibungBeispiele
Daten auslesenZugriff auf alle Account-Metriken und EinstellungenKeywords, Anzeigen, Gebote, Performance-Daten
Änderungen vornehmenAutomatische Anpassungen an KampagnenGebote ändern, Keywords pausieren, Labels setzen
Reports erstellenCustom-Berichte in Google Sheets exportierenPerformance-Reports, Quality Score Tracking
BenachrichtigungenE-Mail-Alerts bei bestimmten EreignissenBudget-Warnung, Broken URLs, Performance-Drops
Externe APIsAnbindung an externe DiensteWetterdaten, Lagerbestand, CRM-Daten

25 Ready-to-Use Google Ads Scripts Collection

Sofort einsetzbare Scripts für Bid Management, Reporting, Account-Optimierung und Performance-Monitoring

Vorteile gegenüber manueller Arbeit

Die manuelle Verwaltung von Google Ads Accounts ist zeitintensiv und fehleranfällig. Scripts nehmen dir repetitive Aufgaben ab und arbeiten rund um die Uhr - auch nachts und am Wochenende, wenn du nicht am Computer sitzt.

Zeitersparnis

  • • 5-10 Stunden pro Woche bei mittelgroßen Accounts
  • • Automatische Reports statt manueller Excel-Arbeit
  • • Sofortige Reaktion auf Probleme statt täglicher Checks
  • • Skalierung auf mehrere Accounts ohne Mehraufwand

Zuverlässigkeit

  • • Keine menschlichen Fehler bei Routine-Aufgaben
  • • 24/7 Monitoring ohne Unterbrechung
  • • Konsistente Ausführung nach definierten Regeln
  • • Dokumentierte Änderungen und Audit-Trail

Vergleich: Manuell vs. Scripts

AufgabeManuellMit ScriptZeitersparnis
Broken URL Check30 min/WocheAutomatisch100%
Budget-Monitoring15 min/TagAutomatisch100%
Search Term Review2 h/Woche30 min/Woche75%
Performance-Reporting1 h/Tag5 min/Tag92%
Quality Score Tracking45 min/WocheAutomatisch100%

ROI-Rechnung

Bei einem Stundensatz von 75 EUR und 8 Stunden Zeitersparnis pro Woche sparst du 600 EUR wöchentlich - oder über 31.000 EUR pro Jahr. Scripts sind eine der besten Investitionen für effizientes Account-Management.

Scripts einrichten: Schritt-für-Schritt

Das Einrichten deines ersten Scripts ist einfacher als du denkst. In weniger als 5 Minuten hast du dein erstes automatisiertes Monitoring aktiv.

Schritt 1: Scripts-Bereich öffnen

1

Navigiere zu Scripts

In deinem Google Ads Account: Tools & Einstellungen → Bulk-Aktionen → Scripts

Alternativ: Direktlink ads.google.com/aw/bulk/scripts

Schritt 2: Neues Script erstellen

2

Klicke auf das Plus-Symbol

Wähle "Neues Script" und gib ihm einen aussagekräftigen Namen.

Tipp: Verwende ein Namensschema wie "[Funktion] - [Frequenz]", z.B. "Budget-Monitor - Stündlich"

Schritt 3: Code einfügen

3

Script-Code eingeben

Lösche den Beispiel-Code und füge dein Script ein. Jedes Script braucht eine main()-Funktion als Einstiegspunkt.

function main() {
  // Dein Code hier
  Logger.log("Script läuft!");
}

Schritt 4: Autorisierung

4

Berechtigungen erteilen

Beim ersten Ausführen musst du dem Script Zugriff auf deinen Account gewähren. Klicke auf "Autorisieren" und folge dem OAuth-Prozess.

Die Autorisierung gilt für alle Scripts in diesem Account.

Schritt 5: Testen und Planen

5

Vorschau und Zeitplan

Nutze die "Vorschau"-Funktion um dein Script zu testen ohne Änderungen vorzunehmen. Wenn alles funktioniert, richte einen Zeitplan ein.

Verfügbare Frequenzen: Stündlich, täglich, wöchentlich oder monatlich

Erfolgreich eingerichtet!

Nach diesen 5 Schritten läuft dein Script automatisch. Du erhältst E-Mail-Benachrichtigungen bei Fehlern und kannst jederzeit die Logs einsehen.

Die 10 nützlichsten Scripts für 2026

Diese Scripts decken die wichtigsten Automatisierungs-Szenarien ab und sind sofort einsetzbar. Kopiere den Code, passe die Konfiguration an und starte die Automatisierung.

1. Budget-Monitoring Script

Überwacht dein Tagesbudget und warnt dich, wenn Kampagnen zu schnell oder zu langsam ausgeben. Unverzichtbar für effektives Budget-Management.

// Budget-Monitoring Script
// Warnt wenn Kampagnen &gt; 90% oder < 50% des Tagesbudgets ausgeben

var EMAIL = "deine@email.de";
var THRESHOLD_HIGH = 0.9;  // 90%
var THRESHOLD_LOW = 0.5;   // 50%

function main() {
  var campaigns = AdsApp.campaigns()
    .withCondition("Status = ENABLED")
    .get();

  var alerts = [];
  var now = new Date();
  var hourOfDay = now.getHours();
  var expectedSpend = hourOfDay / 24;

  while (campaigns.hasNext()) {
    var campaign = campaigns.next();
    var stats = campaign.getStatsFor("TODAY");
    var budget = campaign.getBudget().getAmount();
    var cost = stats.getCost();
    var spendRatio = cost / budget;

    if (spendRatio > THRESHOLD_HIGH) {
      alerts.push(campaign.getName() +
        ": Budget fast aufgebraucht (" +
        Math.round(spendRatio * 100) + "%)");
    }

    if (spendRatio < expectedSpend * THRESHOLD_LOW && hourOfDay &gt; 12) {
      alerts.push(campaign.getName() +
        ": Unterdurchschnittliche Ausgaben (" +
        Math.round(spendRatio * 100) + "%)");
    }
  }

  if (alerts.length &gt; 0) {
    MailApp.sendEmail(EMAIL,
      "Google Ads Budget Alert",
      alerts.join("\n"));
  }
}

2. Automatische Pause bei schlechter Performance

Pausiert automatisch Keywords oder Anzeigengruppen, die deine Performance-Ziele nicht erreichen. Schützt dein Budget vor Verschwendung.

// Auto-Pause bei schlechter Performance
// Pausiert Keywords mit hohen Kosten aber ohne Conversions

var MAX_COST_NO_CONV = 50;  // EUR ohne Conversion
var MIN_CLICKS = 20;        // Mindest-Klicks für Evaluation
var LOOKBACK_DAYS = 30;

function main() {
  var dateRange = getDateRange(LOOKBACK_DAYS);

  var keywords = AdsApp.keywords()
    .withCondition("Status = ENABLED")
    .withCondition("CampaignStatus = ENABLED")
    .withCondition("AdGroupStatus = ENABLED")
    .withCondition("Clicks >= " + MIN_CLICKS)
    .withCondition("Conversions = 0")
    .withCondition("Cost > " + MAX_COST_NO_CONV)
    .forDateRange(dateRange.start, dateRange.end)
    .get();

  var paused = [];

  while (keywords.hasNext()) {
    var keyword = keywords.next();
    keyword.pause();
    keyword.applyLabel("Auto-Paused-Performance");
    paused.push(keyword.getText() + " (Cost: " +
      keyword.getStatsFor(dateRange.start, dateRange.end)
        .getCost() + " EUR)");
  }

  if (paused.length &gt; 0) {
    Logger.log("Pausierte Keywords: " + paused.length);
    Logger.log(paused.join("\n"));
  }
}

function getDateRange(days) {
  var end = new Date();
  var start = new Date();
  start.setDate(start.getDate() - days);
  return {
    start: Utilities.formatDate(start, "GMT", "yyyyMMdd"),
    end: Utilities.formatDate(end, "GMT", "yyyyMMdd")
  };
}

3. Broken URL Checker

Prüft alle aktiven Anzeigen-URLs auf 404-Fehler und andere Probleme. Defekte Landing Pages verschwenden Budget und schaden dem Quality Score.

// Broken URL Checker
// Prüft Final URLs auf HTTP-Fehler

var EMAIL = "deine@email.de";

function main() {
  var ads = AdsApp.ads()
    .withCondition("Status = ENABLED")
    .withCondition("CampaignStatus = ENABLED")
    .withCondition("AdGroupStatus = ENABLED")
    .get();

  var brokenUrls = [];
  var checkedUrls = {};

  while (ads.hasNext()) {
    var ad = ads.next();
    var urls = ad.urls().getFinalUrl();

    if (urls && !checkedUrls[urls]) {
      checkedUrls[urls] = true;
      var status = checkUrl(urls);

      if (status !== 200) {
        brokenUrls.push({
          campaign: ad.getCampaign().getName(),
          adGroup: ad.getAdGroup().getName(),
          url: urls,
          status: status
        });
      }
    }
  }

  if (brokenUrls.length &gt; 0) {
    var report = "Broken URLs gefunden:\n\n";
    brokenUrls.forEach(function(item) {
      report += "Kampagne: " + item.campaign + "\n";
      report += "Anzeigengruppe: " + item.adGroup + "\n";
      report += "URL: " + item.url + "\n";
      report += "Status: " + item.status + "\n\n";
    });

    MailApp.sendEmail(EMAIL,
      "Google Ads: " + brokenUrls.length + " Broken URLs",
      report);
  }
}

function checkUrl(url) {
  try {
    var response = UrlFetchApp.fetch(url, {
      muteHttpExceptions: true,
      followRedirects: true
    });
    return response.getResponseCode();
  } catch (e) {
    return "Error: " + e.message;
  }
}

4. Quality Score Tracker

Trackt die Entwicklung des Quality Scores über Zeit in einem Google Sheet. Essenziell für nachhaltige Kampagnenoptimierung.

// Quality Score Tracker
// Exportiert QS-Daten täglich in Google Sheets

var SPREADSHEET_URL = "https://docs.google.com/spreadsheets/d/xxx/edit";

function main() {
  var ss = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet = ss.getSheetByName("QS-Tracking") ||
    ss.insertSheet("QS-Tracking");

  var today = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd");

  var report = AdsApp.report(
    "SELECT CampaignName, AdGroupName, Criteria, QualityScore, " +
    "SearchPredictedCtr, CreativeQualityScore, " +
    "PostClickQualityScore, Impressions " +
    "FROM KEYWORDS_PERFORMANCE_REPORT " +
    "WHERE QualityScore &gt; 0 " +
    "AND Impressions &gt; 100 " +
    "DURING LAST_7_DAYS"
  );

  var rows = report.rows();
  var data = [];

  while (rows.hasNext()) {
    var row = rows.next();
    data.push([
      today,
      row["CampaignName"],
      row["AdGroupName"],
      row["Criteria"],
      row["QualityScore"],
      row["SearchPredictedCtr"],
      row["CreativeQualityScore"],
      row["PostClickQualityScore"],
      row["Impressions"]
    ]);
  }

  if (data.length &gt; 0) {
    // Header falls Sheet leer
    if (sheet.getLastRow() === 0) {
      sheet.appendRow([
        "Datum", "Kampagne", "Anzeigengruppe", "Keyword",
        "QS", "Erwartete CTR", "Anzeigenrelevanz",
        "Landing Page", "Impressions"
      ]);
    }

    sheet.getRange(sheet.getLastRow() + 1, 1,
      data.length, data[0].length).setValues(data);
  }

  Logger.log("QS-Daten exportiert: " + data.length + " Keywords");
}

5. Negative Keyword Conflicts Finder

Findet Konflikte zwischen deinen aktiven Keywords und negativen Keywords. Verhindert, dass wichtige Suchanfragen versehentlich blockiert werden.

// Negative Keyword Conflict Finder
// Findet Keywords die durch Negatives blockiert werden

var EMAIL = "deine@email.de";

function main() {
  var conflicts = [];

  var campaigns = AdsApp.campaigns()
    .withCondition("Status = ENABLED")
    .get();

  while (campaigns.hasNext()) {
    var campaign = campaigns.next();
    var campaignName = campaign.getName();

    // Sammle alle negativen Keywords
    var negatives = [];
    var negKeywords = campaign.negativeKeywords().get();
    while (negKeywords.hasNext()) {
      negatives.push(negKeywords.next().getText()
        .toLowerCase().replace(/[\[\]"\+]/g, ""));
    }

    // Prüfe aktive Keywords
    var keywords = campaign.keywords()
      .withCondition("Status = ENABLED")
      .get();

    while (keywords.hasNext()) {
      var keyword = keywords.next();
      var kwText = keyword.getText()
        .toLowerCase().replace(/[\[\]"\+]/g, "");

      negatives.forEach(function(neg) {
        if (kwText.indexOf(neg) !== -1 || neg.indexOf(kwText) !== -1) {
          conflicts.push({
            campaign: campaignName,
            keyword: keyword.getText(),
            negative: neg,
            matchType: keyword.getMatchType()
          });
        }
      });
    }
  }

  if (conflicts.length &gt; 0) {
    var report = "Negative Keyword Konflikte gefunden:\n\n";
    conflicts.forEach(function(c) {
      report += "Kampagne: " + c.campaign + "\n";
      report += "Keyword: " + c.keyword + " (" + c.matchType + ")\n";
      report += "Negatives: " + c.negative + "\n\n";
    });

    MailApp.sendEmail(EMAIL,
      conflicts.length + " Negative Keyword Konflikte", report);
  }
}

6. Search Term Mining Script

Findet automatisch neue Keyword-Chancen aus deinen Suchbegriffen und identifiziert irrelevante Begriffe für negative Keywords. Perfekt für KI-gestützte Keyword-Recherche.

// Search Term Mining Script
// Findet neue Keywords und Negative-Kandidaten

var SPREADSHEET_URL = "https://docs.google.com/spreadsheets/d/xxx/edit";
var MIN_IMPRESSIONS = 10;
var MIN_CONVERSIONS_POSITIVE = 1;
var MIN_CLICKS_NEGATIVE = 5;
var MAX_CTR_NEGATIVE = 0.01;  // 1%

function main() {
  var ss = SpreadsheetApp.openByUrl(SPREADSHEET_URL);

  var positiveSheet = ss.getSheetByName("Neue Keywords") ||
    ss.insertSheet("Neue Keywords");
  var negativeSheet = ss.getSheetByName("Negative Kandidaten") ||
    ss.insertSheet("Negative Kandidaten");

  var report = AdsApp.report(
    "SELECT Query, CampaignName, Impressions, Clicks, " +
    "Conversions, Cost, Ctr " +
    "FROM SEARCH_QUERY_PERFORMANCE_REPORT " +
    "WHERE Impressions >= " + MIN_IMPRESSIONS + " " +
    "DURING LAST_30_DAYS"
  );

  var positiveKeywords = [];
  var negativeKeywords = [];
  var rows = report.rows();

  while (rows.hasNext()) {
    var row = rows.next();
    var conversions = parseFloat(row["Conversions"]);
    var clicks = parseInt(row["Clicks"]);
    var ctr = parseFloat(row["Ctr"].replace("%", "")) / 100;

    // Gute Performance = neues Keyword
    if (conversions >= MIN_CONVERSIONS_POSITIVE) {
      positiveKeywords.push([
        row["Query"],
        row["CampaignName"],
        row["Impressions"],
        row["Clicks"],
        conversions,
        row["Cost"]
      ]);
    }

    // Schlechte Performance = Negative-Kandidat
    if (clicks >= MIN_CLICKS_NEGATIVE &&
        conversions === 0 &&
        ctr < MAX_CTR_NEGATIVE) {
      negativeKeywords.push([
        row["Query"],
        row["CampaignName"],
        row["Impressions"],
        row["Clicks"],
        ctr,
        row["Cost"]
      ]);
    }
  }

  // Export
  if (positiveKeywords.length &gt; 0) {
    positiveSheet.clear();
    positiveSheet.appendRow([
      "Suchbegriff", "Kampagne", "Impressions",
      "Klicks", "Conversions", "Kosten"
    ]);
    positiveSheet.getRange(2, 1, positiveKeywords.length,
      positiveKeywords[0].length).setValues(positiveKeywords);
  }

  if (negativeKeywords.length &gt; 0) {
    negativeSheet.clear();
    negativeSheet.appendRow([
      "Suchbegriff", "Kampagne", "Impressions",
      "Klicks", "CTR", "Kosten"
    ]);
    negativeSheet.getRange(2, 1, negativeKeywords.length,
      negativeKeywords[0].length).setValues(negativeKeywords);
  }

  Logger.log("Neue Keywords: " + positiveKeywords.length);
  Logger.log("Negative Kandidaten: " + negativeKeywords.length);
}

7. Automatische Bid Adjustments

Passt Gebote automatisch basierend auf Performance-Daten an. Ideal für Accounts, die keine Smart Bidding nutzen können oder wollen.

// Automatische Bid Adjustments
// Erhöht/senkt Gebote basierend auf CPA-Performance

var TARGET_CPA = 25;        // Ziel-CPA in EUR
var MAX_BID_CHANGE = 0.2;   // Max 20% Änderung
var MIN_CONVERSIONS = 3;    // Mindest-Conversions
var LOOKBACK_DAYS = 14;

function main() {
  var dateRange = getDateRange(LOOKBACK_DAYS);

  var keywords = AdsApp.keywords()
    .withCondition("Status = ENABLED")
    .withCondition("Conversions >= " + MIN_CONVERSIONS)
    .forDateRange(dateRange.start, dateRange.end)
    .get();

  var changes = [];

  while (keywords.hasNext()) {
    var keyword = keywords.next();
    var stats = keyword.getStatsFor(dateRange.start, dateRange.end);
    var cost = stats.getCost();
    var conversions = stats.getConversions();

    if (conversions &gt; 0) {
      var actualCpa = cost / conversions;
      var currentBid = keyword.bidding().getCpc();
      var newBid = currentBid;

      if (actualCpa < TARGET_CPA * 0.8) {
        // CPA zu niedrig - Gebot erhöhen
        var increase = Math.min(MAX_BID_CHANGE,
          (TARGET_CPA - actualCpa) / TARGET_CPA);
        newBid = currentBid * (1 + increase);
      } else if (actualCpa > TARGET_CPA * 1.2) {
        // CPA zu hoch - Gebot senken
        var decrease = Math.min(MAX_BID_CHANGE,
          (actualCpa - TARGET_CPA) / TARGET_CPA);
        newBid = currentBid * (1 - decrease);
      }

      if (newBid !== currentBid) {
        keyword.bidding().setCpc(newBid);
        changes.push({
          keyword: keyword.getText(),
          oldBid: currentBid,
          newBid: newBid,
          cpa: actualCpa
        });
      }
    }
  }

  Logger.log("Bid Adjustments: " + changes.length);
  changes.forEach(function(c) {
    Logger.log(c.keyword + ": " + c.oldBid.toFixed(2) +
      " -> " + c.newBid.toFixed(2) + " (CPA: " +
      c.cpa.toFixed(2) + ")");
  });
}

function getDateRange(days) {
  var end = new Date();
  var start = new Date();
  start.setDate(start.getDate() - days);
  return {
    start: Utilities.formatDate(start, "GMT", "yyyyMMdd"),
    end: Utilities.formatDate(end, "GMT", "yyyyMMdd")
  };
}

8. Automatisches Reporting Script

Erstellt automatisch tägliche, wöchentliche oder monatliche Performance-Reports in Google Sheets. Ersetzt manuelle Excel-Arbeit komplett.

// Automatisches Performance Reporting
// Exportiert Kampagnen-Performance in Google Sheets

var SPREADSHEET_URL = "https://docs.google.com/spreadsheets/d/xxx/edit";
var EMAIL = "deine@email.de";

function main() {
  var ss = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var today = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd");
  var sheetName = "Report " + today;

  var sheet = ss.getSheetByName(sheetName) || ss.insertSheet(sheetName);
  sheet.clear();

  // Account-Übersicht
  var accountStats = AdsApp.currentAccount().getStatsFor("LAST_7_DAYS");
  sheet.appendRow(["Account Performance - Letzte 7 Tage"]);
  sheet.appendRow(["Impressions", accountStats.getImpressions()]);
  sheet.appendRow(["Klicks", accountStats.getClicks()]);
  sheet.appendRow(["Kosten", accountStats.getCost()]);
  sheet.appendRow(["Conversions", accountStats.getConversions()]);
  sheet.appendRow(["CTR", (accountStats.getCtr() * 100).toFixed(2) + "%"]);
  sheet.appendRow([""]);

  // Kampagnen-Details
  sheet.appendRow([
    "Kampagne", "Status", "Impressions", "Klicks",
    "CTR", "Kosten", "Conversions", "CPA"
  ]);

  var campaigns = AdsApp.campaigns()
    .withCondition("Impressions &gt; 0")
    .forDateRange("LAST_7_DAYS")
    .orderBy("Cost DESC")
    .get();

  var data = [];
  while (campaigns.hasNext()) {
    var campaign = campaigns.next();
    var stats = campaign.getStatsFor("LAST_7_DAYS");
    var conversions = stats.getConversions();
    var cost = stats.getCost();

    data.push([
      campaign.getName(),
      campaign.isEnabled() ? "Aktiv" : "Pausiert",
      stats.getImpressions(),
      stats.getClicks(),
      (stats.getCtr() * 100).toFixed(2) + "%",
      cost.toFixed(2),
      conversions,
      conversions &gt; 0 ? (cost / conversions).toFixed(2) : "-"
    ]);
  }

  if (data.length &gt; 0) {
    sheet.getRange(9, 1, data.length, data[0].length).setValues(data);
  }

  // E-Mail mit Link
  MailApp.sendEmail(EMAIL,
    "Google Ads Report " + today,
    "Der aktuelle Performance-Report ist verfügbar:\n\n" +
    SPREADSHEET_URL);

  Logger.log("Report erstellt: " + data.length + " Kampagnen");
}

9. Automatisches Label Management

Vergibt automatisch Labels basierend auf Performance-Kategorien. Macht Filtering und Reporting viel einfacher.

// Automatisches Label Management
// Kategorisiert Keywords nach Performance

var LABELS = {
  TOP_PERFORMER: "Top Performer",
  GOOD: "Gute Performance",
  AVERAGE: "Durchschnitt",
  UNDERPERFORMER: "Underperformer",
  NO_DATA: "Keine Daten"
};

function main() {
  // Stelle sicher dass Labels existieren
  Object.values(LABELS).forEach(function(label) {
    try {
      AdsApp.createLabel(label);
    } catch (e) {
      // Label existiert bereits
    }
  });

  var keywords = AdsApp.keywords()
    .withCondition("Status = ENABLED")
    .withCondition("CampaignStatus = ENABLED")
    .forDateRange("LAST_30_DAYS")
    .get();

  var counts = {};
  Object.values(LABELS).forEach(function(l) { counts[l] = 0; });

  while (keywords.hasNext()) {
    var keyword = keywords.next();
    var stats = keyword.getStatsFor("LAST_30_DAYS");

    // Entferne alte Performance-Labels
    Object.values(LABELS).forEach(function(label) {
      keyword.removeLabel(label);
    });

    var impressions = stats.getImpressions();
    var conversions = stats.getConversions();
    var cost = stats.getCost();
    var newLabel;

    if (impressions < 100) {
      newLabel = LABELS.NO_DATA;
    } else if (conversions >= 5) {
      newLabel = LABELS.TOP_PERFORMER;
    } else if (conversions >= 2) {
      newLabel = LABELS.GOOD;
    } else if (conversions >= 1 || cost < 20) {
      newLabel = LABELS.AVERAGE;
    } else {
      newLabel = LABELS.UNDERPERFORMER;
    }

    keyword.applyLabel(newLabel);
    counts[newLabel]++;
  }

  Logger.log("Label-Verteilung:");
  Object.keys(counts).forEach(function(label) {
    Logger.log(label + ": " + counts[label]);
  });
}

10. Wettbewerber-Monitoring Script

Trackt deine Auction Insights Metriken und alarmiert dich bei signifikanten Veränderungen der Wettbewerbslandschaft.

// Wettbewerber-Monitoring Script
// Trackt Auction Insights über Zeit

var SPREADSHEET_URL = "https://docs.google.com/spreadsheets/d/xxx/edit";
var EMAIL = "deine@email.de";
var ALERT_THRESHOLD = 0.1;  // 10% Veränderung

function main() {
  var ss = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet = ss.getSheetByName("Wettbewerber") ||
    ss.insertSheet("Wettbewerber");

  var today = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd");

  var report = AdsApp.report(
    "SELECT Domain, SearchImpressionShare, " +
    "SearchOverlapRate, SearchPositionAboveRate, " +
    "SearchTopImpressionShare, SearchAbsoluteTopImpressionShare " +
    "FROM AUCTION_INSIGHTS_REPORT " +
    "DURING LAST_7_DAYS"
  );

  var rows = report.rows();
  var currentData = [];
  var alerts = [];

  // Hole vorherige Daten für Vergleich
  var previousData = getPreviousData(sheet);

  while (rows.hasNext()) {
    var row = rows.next();
    var domain = row["Domain"];
    var impressionShare = parseFloat(row["SearchImpressionShare"]) / 100;
    var overlapRate = parseFloat(row["SearchOverlapRate"]) / 100;
    var positionAbove = parseFloat(row["SearchPositionAboveRate"]) / 100;

    currentData.push([
      today,
      domain,
      impressionShare,
      overlapRate,
      positionAbove,
      row["SearchTopImpressionShare"],
      row["SearchAbsoluteTopImpressionShare"]
    ]);

    // Prüfe auf signifikante Änderungen
    if (previousData[domain]) {
      var prevIS = previousData[domain].impressionShare;
      var change = impressionShare - prevIS;

      if (Math.abs(change) > ALERT_THRESHOLD) {
        alerts.push(domain + ": Impression Share " +
          (change &gt; 0 ? "+" : "") +
          (change * 100).toFixed(1) + "%");
      }
    }
  }

  // Speichere Daten
  if (sheet.getLastRow() === 0) {
    sheet.appendRow([
      "Datum", "Domain", "Impression Share",
      "Overlap Rate", "Position Above Rate",
      "Top IS", "Absolute Top IS"
    ]);
  }

  if (currentData.length &gt; 0) {
    sheet.getRange(sheet.getLastRow() + 1, 1,
      currentData.length, currentData[0].length)
      .setValues(currentData);
  }

  // Sende Alerts
  if (alerts.length &gt; 0) {
    MailApp.sendEmail(EMAIL,
      "Wettbewerber-Alert: Signifikante Änderungen",
      alerts.join("\n"));
  }

  Logger.log("Wettbewerber getrackt: " + currentData.length);
}

function getPreviousData(sheet) {
  var data = {};
  var lastRow = sheet.getLastRow();

  if (lastRow &gt; 1) {
    var values = sheet.getRange(2, 1, lastRow - 1, 7).getValues();
    values.forEach(function(row) {
      data[row[1]] = {
        impressionShare: row[2],
        overlapRate: row[3],
        positionAbove: row[4]
      };
    });
  }

  return data;
}

25 Ready-to-Use Google Ads Scripts Collection

Sofort einsetzbare Scripts für Bid Management, Reporting, Account-Optimierung und Performance-Monitoring

Scripts mit KI/ChatGPT erstellen lassen

Du musst kein Programmierer sein um eigene Scripts zu erstellen. Mit KI-Tools wie ChatGPT, Claude oder Google Gemini kannst du maßgeschneiderte Scripts für deine spezifischen Anforderungen generieren lassen.

Der perfekte Prompt für Google Ads Scripts

Kopiere diesen Prompt und passe ihn an deine Anforderungen an:

Erstelle ein Google Ads Script mit folgenden Anforderungen:

Funktion: [Beschreibe was das Script tun soll]
Trigger: [Wann soll es laufen - stündlich/täglich/wöchentlich]
Bedingungen: [Welche Filter oder Schwellenwerte]
Aktion: [Was soll passieren - pausieren/Gebot ändern/Report]
Benachrichtigung: [E-Mail an: xyz@email.de]

Das Script soll:
- Gut kommentiert sein
- Konfigurierbare Variablen am Anfang haben
- Fehlerbehandlung enthalten
- Die Google Ads Scripts API verwenden

Beispiel-Prompt in Aktion

Dein Prompt

"Erstelle ein Script das alle Keywords pausiert die in den letzten 30 Tagen mehr als 100 EUR ausgegeben haben aber keine Conversion generiert haben. Sende mir eine E-Mail mit der Liste der pausierten Keywords."

KI-Output

Die KI generiert ein vollständiges, lauffähiges Script mit Konfigurationsvariablen, Fehlerbehandlung und E-Mail-Benachrichtigung - inklusive Kommentaren die jeden Schritt erklären.

Wichtig: Immer testen!

KI-generierte Scripts solltest du immer erst mit der "Vorschau"-Funktion testen bevor du sie aktivierst. Prüfe die Logs und stelle sicher, dass das Script das tut was du erwartest.

Tipps für bessere KI-generierte Scripts

Sei spezifisch bei Bedingungen

Statt "pausiere schlechte Keywords" sage "pausiere Keywords mit mehr als 50 Klicks und 0 Conversions in den letzten 14 Tagen"

Definiere Grenzwerte klar

Gib konkrete Zahlen an: EUR, Prozentsätze, Zeiträume, Minimum/Maximum-Werte

Fordere Konfigurierbarkeit

Bitte um Variablen am Script-Anfang, damit du Werte später leicht anpassen kannst

Verlange Logging

Scripts sollten Logger.log() verwenden damit du nachvollziehen kannst was passiert ist

Debugging und Fehlerbehandlung

Scripts können fehlschlagen - das ist normal. Wichtig ist, dass du Fehler schnell findest und behebst. Hier sind die häufigsten Probleme und ihre Lösungen.

Häufige Fehler und Lösungen

FehlerUrsacheLösung
Timeout exceededScript läuft länger als 30 MinutenVerarbeite weniger Daten pro Lauf, nutze Labels für Batches
Authorization requiredFehlende Berechtigungen für APIScript erneut autorisieren, Berechtigungen prüfen
Cannot call method of nullObjekt existiert nichtPrüfe ob Kampagnen/Keywords aktiv sind, füge null-Checks hinzu
Quota exceededZu viele API-AufrufeReduziere Aufrufe, nutze Batch-Operationen
Invalid date rangeFalsches DatumsformatNutze yyyyMMdd Format oder vordefinierte Ranges

Debugging-Best-Practices

// Best Practice: Try-Catch für Fehlerbehandlung
function main() {
  try {
    // Dein Code hier
    processKeywords();
  } catch (error) {
    Logger.log("FEHLER: " + error.message);
    Logger.log("Stack: " + error.stack);

    // Optional: E-Mail bei kritischen Fehlern
    MailApp.sendEmail(
      "deine@email.de",
      "Script-Fehler: " + error.message,
      "Details:\n" + error.stack
    );
  }
}

// Best Practice: Ausführliches Logging
function processKeywords() {
  Logger.log("=== Script gestartet ===");
  Logger.log("Zeitstempel: " + new Date());

  var keywords = AdsApp.keywords()
    .withCondition("Status = ENABLED")
    .get();

  Logger.log("Keywords gefunden: " + keywords.totalNumEntities());

  var processed = 0;
  var errors = 0;

  while (keywords.hasNext()) {
    try {
      var keyword = keywords.next();
      // Verarbeitung...
      processed++;
    } catch (e) {
      Logger.log("Fehler bei Keyword: " + e.message);
      errors++;
    }
  }

  Logger.log("=== Script beendet ===");
  Logger.log("Verarbeitet: " + processed + ", Fehler: " + errors);
}

Pro-Tipp: Vorschau nutzen

Die Vorschau-Funktion zeigt dir genau was das Script tun würde, ohne Änderungen vorzunehmen. Nutze sie intensiv während der Entwicklung und nach jeder Code-Änderung.

Scripts planen und automatisieren

Die wahre Power von Scripts entfaltet sich durch automatische Zeitpläne. Einmal eingerichtet, arbeiten sie rund um die Uhr für dich.

Verfügbare Frequenzen

FrequenzBeste fürBeispiel-Scripts
StündlichZeitkritisches MonitoringBudget-Alerts, Broken URL Check, Bid Adjustments
TäglichRoutine-Checks und ReportsPerformance-Reports, QS-Tracking, Label-Updates
WöchentlichOptimierungen, tiefe AnalysenSearch Term Mining, Wettbewerber-Analyse, Keyword-Pause
MonatlichStrategische ReviewsPerformance-Summaries, Budget-Planung

Zeitplan einrichten

So richtest du einen Zeitplan ein

  1. Öffne dein Script und klicke auf das Uhr-Symbol
  2. Wähle "Zeitplan erstellen"
  3. Wähle Frequenz (Stündlich/Täglich/Wöchentlich/Monatlich)
  4. Für täglich+: Wähle Uhrzeit (basierend auf Account-Zeitzone)
  5. Für wöchentlich: Wähle Wochentag
  6. Speichern

Optimale Uhrzeit

Plane tägliche Scripts früh morgens (z.B. 6:00), damit Reports fertig sind bevor du arbeitest. Stündliche Monitoring-Scripts sollten zu vollen Stunden laufen für bessere Vergleichbarkeit.

Sicherheit und Best Practices

Scripts haben vollen Zugriff auf deinen Account und können Änderungen vornehmen. Folge diesen Best Practices um Risiken zu minimieren.

Sicherheits-Checkliste

Do's

  • • Immer zuerst Vorschau testen
  • • Änderungen loggen und dokumentieren
  • • Maximale Änderungen pro Lauf begrenzen
  • • E-Mail-Alerts für kritische Aktionen
  • • Regelmäßige Script-Reviews
  • • Backup der Script-Codes extern speichern

Don'ts

  • • Scripts ohne Test aktivieren
  • • Passwörter oder API-Keys im Code speichern
  • • Unbegrenzte Änderungen erlauben
  • • Scripts von unbekannten Quellen verwenden
  • • Fehlermeldungen ignorieren
  • • Scripts vergessen und nie überprüfen

Best Practice: Sicherheitslimits einbauen

// Best Practice: Sicherheitslimits
var CONFIG = {
  MAX_CHANGES_PER_RUN: 50,    // Maximal 50 Änderungen
  DRY_RUN: true,              // Test-Modus: keine echten Änderungen
  NOTIFY_EMAIL: "deine@email.de"
};

function main() {
  var changesCount = 0;
  var changes = [];

  var keywords = AdsApp.keywords()
    .withCondition("Status = ENABLED")
    .get();

  while (keywords.hasNext() && changesCount < CONFIG.MAX_CHANGES_PER_RUN) {
    var keyword = keywords.next();

    // Prüfe ob Änderung nötig
    if (shouldPause(keyword)) {
      if (CONFIG.DRY_RUN) {
        Logger.log("[DRY RUN] Würde pausieren: " + keyword.getText());
      } else {
        keyword.pause();
        Logger.log("Pausiert: " + keyword.getText());
      }

      changes.push(keyword.getText());
      changesCount++;
    }
  }

  // Benachrichtigung bei Änderungen
  if (changes.length &gt; 0 && !CONFIG.DRY_RUN) {
    MailApp.sendEmail(
      CONFIG.NOTIFY_EMAIL,
      "Script-Änderungen: " + changes.length + " Keywords",
      "Folgende Keywords wurden pausiert:\n" + changes.join("\n")
    );
  }

  Logger.log("Änderungen: " + changesCount +
    (CONFIG.DRY_RUN ? " (Dry Run)" : ""));
}

function shouldPause(keyword) {
  // Deine Pausier-Logik hier
  return false;
}

Zugriffskontrolle

Scripts können nur von Account-Administratoren erstellt und bearbeitet werden. Stelle sicher, dass nur vertrauenswürdige Personen Admin-Zugriff haben.

Häufig gestellte Fragen

Brauche ich Programmierkenntnisse für Google Ads Scripts?
Nein, nicht mehr! Mit KI-Tools wie ChatGPT oder Claude kannst du Scripts in natürlicher Sprache beschreiben und dir funktionsfähigen Code generieren lassen. Für einfache Anpassungen an bestehenden Scripts reicht es, die Konfigurationsvariablen am Anfang zu verstehen. Für komplexere Anpassungen hilft die KI ebenfalls.
Wie lange darf ein Google Ads Script maximal laufen?
Google Ads Scripts haben ein Timeout von 30 Minuten. Bei MCC-Scripts (Manager-Accounts) gilt ein Limit von 60 Minuten. Wenn dein Script länger braucht, musst du es in kleinere Batches aufteilen und Labels verwenden um den Fortschritt zu tracken.
Kosten Google Ads Scripts etwas?
Nein, Google Ads Scripts sind komplett kostenlos. Du zahlst nur für die Werbung selbst. Es gibt auch keine Limits für die Anzahl der Scripts die du erstellen kannst. Die Nutzung von Google Sheets für Reports ist ebenfalls kostenlos (im Rahmen deines Google-Accounts).
Kann ein Script meinen Account beschädigen?
Scripts haben volle Schreibrechte und können Kampagnen, Keywords und Gebote ändern. Ein fehlerhaftes Script könnte theoretisch alle Keywords pausieren oder Budgets ändern. Deshalb sind Sicherheitsmaßnahmen wichtig: Nutze immer die Vorschau, baue Limits ein, aktiviere E-Mail-Alerts und starte mit konservativen Einstellungen.
Wie oft sollte ich meine Scripts überprüfen?
Mindestens einmal pro Woche solltest du die Logs deiner aktiven Scripts prüfen. Achte auf Fehlermeldungen und unerwartete Outputs. Monatlich solltest du prüfen ob die Scripts noch relevant sind und die Konfiguration noch zu deiner aktuellen Strategie passt.
Funktionieren Scripts auch in MCC-Accounts (Manager-Accounts)?
Ja, es gibt spezielle MCC-Scripts die über mehrere Accounts hinweg arbeiten können. Der Syntax unterscheidet sich leicht - statt AdsApp verwendest du AdsManagerApp.accounts() um über alle Unter-Accounts zu iterieren. Das Timeout ist bei MCC-Scripts 60 statt 30 Minuten.
Kann ich mit Scripts auf externe APIs zugreifen?
Ja, mit UrlFetchApp kannst du HTTP-Requests an externe APIs senden. Das ermöglicht Integrationen mit CRM-Systemen, Wetter-APIs, Lagerbestandssystemen und mehr. Beachte dass externe Calls Zeit kosten und zum Timeout beitragen.

Google Ads Automatisierung auf das nächste Level bringen?

Scripts sind nur der Anfang. In unserem AI Training Workshop lernst du, wie du Scripts mit KI-Tools kombinierst, komplexe Automatisierungs-Workflows erstellst und deine Google Ads Verwaltung auf ein neues Effizienz-Level hebst.

AI Training Workshop entdecken