Google Ads Scripts: 10 fertige Skripte zum Kopieren (2026)
Google Ads Scripts automatisieren Gebote, Berichte und Monitoring mit JavaScript direkt in Google Ads. 10 einsatzbereite Copy-Paste-Skripte sind enthalten: Budgetwächter, Performance-Alerts, automatische Reports und 7 weitere Automatisierungen.
Was sind Google Ads Scripts?
Google Ads Scripts integrieren JavaScript-Programmierung direkt in Google Ads Kampagnen und eliminieren manuelle Anpassungen sowie kostenpflichtige Drittanbieter-Tools wie Optmyzr für Standardaufgaben. Jedes Script reduziert den manuellen Optimierungsaufwand um bis zu 80 % – laut WordStream DACH-Benchmarks 2026 setzen bereits 43 % der deutschen KMU mindestens 1 Script aktiv ein.
Definition und Funktionsweise
Google Ads Scripts sind JavaScript-Programme, die auf Googles Servern laufen und vollständigen Zugriff auf Ihr Google Ads Konto besitzen. Scripts analysieren Kampagnen, exportieren Daten nach Google Sheets, rufen externe APIs ab und senden E-Mail-Benachrichtigungen – alles innerhalb einer einzigen Ausführung.
Wie funktioniert es technisch? Ein Script läuft direkt in der Google Cloud, nicht im Browser. Der Google Ads Script-Editor nimmt den Code entgegen, führt Tests durch und plant die automatische Ausführung – z. B. täglich um 06:00 Uhr MEZ – ohne dass Sie online sein müssen.
Was leisten Scripts konkret?
- Kampagnen, Anzeigengruppen, Keywords und Anzeigen lesen und bearbeiten
- Gebote basierend auf Performance-Daten oder externen Signalen anpassen
- Keywords pausieren, aktivieren oder hinzufügen
- Berichte per E-Mail versenden oder in Google Sheets exportieren
- Externe APIs abfragen (Wetterdaten, Aktienkurse, eigene Datenbanken)
- Anomalien erkennen (plötzliche Budget-Überschreitungen, Performance-Einbrüche)
- Custom-Dashboards in Google Sheets und Looker Studio erstellen
4 zentrale Grenzen von Scripts:
- Laufzeit-Limit: 30 Minuten pro Execution – für Konten mit mehr als 10.000 Keywords limitierend
- Keine UI-Änderungen: Scripts ändern ausschließlich Daten und Einstellungen, nicht die Google Ads Oberfläche
- Fehlerbehandlung liegt beim Nutzer: Fehlerhafte Scripts nehmen unkontrollierte Änderungen vor
- Execution-Limit: Scripts laufen maximal einmal pro Stunde
JavaScript-Grundlagen für Scripts
JavaScript-Grundkenntnisse beschleunigen die Script-Entwicklung um mindestens 60 % – für einfache Automatisierungen genügen jedoch 5 Kernkonzepte.
5 wichtige JavaScript-Konzepte:
- Variablen: Speichern von Werten (
var clicks = 100;) - Funktionen: Wiederverwendbare Code-Blöcke (
function sendEmail() { ... }) - Schleifen: Wiederholte Aktionen (
forundwhileLoops) - Bedingungen: Entscheidungslogik (
if,else) - Objekte und Arrays: Strukturierte Datensammlungen
5 Google Ads spezifische Elemente:
AdsApp: Das Hauptobjekt für den KontozugriffLogger.log(): Ausgabe von Debug-Informationen- Selectors: Abfragen von Entitäten (z. B.
AdsApp.campaigns().get()) - Iterators: Durchlaufen von Ergebnismengen
- Builders: Erstellen neuer Entitäten wie Keywords oder Anzeigengruppen
Das entscheidende Ergebnis: Fertige Scripts aus diesem Guide liefern sofortigen Mehrwert per Copy-Paste – ohne eigene Programmierung von Grund auf. Die meisten Scripts folgen identischen Mustern, die sich mit minimalen Anpassungen auf jedes Konto übertragen lassen.
Erstes Script erstellen
Das erste Script erstellt ein Konto-Inventar aller aktiven Kampagnen – in unter 5 Minuten lauffähig und ohne Änderungsrisiko.
Script-Editor öffnen
- Bei Google Ads anmelden
- „Tools und Einstellungen" aufrufen (Schraubenschlüssel-Symbol)
- Unter „Bulk-Aktionen" den Punkt „Scripts" wählen
- Das Plus-Symbol „+ Script" anklicken
Der Script-Editor zeigt 3 Bereiche: ein Code-Fenster mit Beispiel-Code, Buttons für Vorschau und Ausführung sowie Optionen für die Zeitplanung.
Script schreiben und testen
Ersetzen Sie den Beispiel-Code durch dieses einfache Script:
function main() {
// Kampagnen abrufen
var campaignIterator = AdsApp.campaigns()
.withCondition("Status = ENABLED")
.get();
// Kampagnen zählen und loggen
var campaignCount = 0;
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
Logger.log("Kampagne: " + campaign.getName());
campaignCount++;
}
Logger.log("Gesamt aktive Kampagnen: " + campaignCount);
}
4 Schritte, die dieses Script ausführt:
- Alle aktiven Kampagnen aus Google Ads abrufen
- Jede Kampagne einzeln durchlaufen
- Den Kampagnennamen in das Log schreiben
- Die Gesamtzahl der Kampagnen ausgeben
Vorschau-Modus in 3 Schritten nutzen:
- „Vorschau" rechts oben anklicken
- Das Script läuft – nimmt aber keine Änderungen vor
- Im „Logs"-Bereich die Ausgabe prüfen
Das Log zeigt alle Kampagnennamen und die Gesamtzahl. Das erste Google Ads Script läuft.
Script planen und ausführen
Automatische Ausführung spart 15 Minuten täglicher manueller Kontrolle – aktiviert durch diesen 4-Schritte-Prozess:
- Dem Script einen Namen geben (z. B. „Kampagnen-Übersicht")
- „Autorisieren" anklicken – Google Ads fordert einmalig Kontozugriff an
- Für einmalige Ausführung: „Ausführen" anklicken
- Für automatische Ausführung: „Häufigkeit" wählen (täglich, wöchentlich oder stündlich)
Neue Scripts immer im Vorschau-Modus vollständig testen, bevor die automatische Ausführung aktiviert wird.
10 praktische Script-Beispiele
Diese 10 Scripts lösen reale Probleme der Kampagnenverwaltung – direkt einsetzbar per Copy-Paste, mit minimalen Anpassungen an Ihre Kontodaten.
1. Täglicher Performance-Report per E-Mail
Dieser automatische E-Mail-Report liefert täglich die 4 wichtigsten Metriken des Vortags – Klicks, Kosten, Conversions und Kampagnenname – ohne manuelle Auswertung in Google Ads.
function main() {
var yesterday = getYesterday();
var today = getToday();
var report = AdsApp.report(
"SELECT CampaignName, Impressions, Clicks, Cost, Conversions " +
"FROM CAMPAIGN_PERFORMANCE_REPORT " +
"WHERE CampaignStatus = 'ENABLED' " +
"DURING " + yesterday + "," + today
);
var rows = report.rows();
var emailBody = "Google Ads Performance Gestern:\n\n";
var totalCost = 0;
var totalConversions = 0;
while (rows.hasNext()) {
var row = rows.next();
emailBody += row['CampaignName'] + ": ";
emailBody += row['Clicks'] + " Klicks, ";
emailBody += row['Cost'] + " EUR, ";
emailBody += row['Conversions'] + " Conversions\n";
totalCost += parseFloat(row['Cost']);
totalConversions += parseFloat(row['Conversions']);
}
emailBody += "\nGesamt: " + totalCost.toFixed(2) + " EUR, " + totalConversions + " Conversions";
MailApp.sendEmail({
to: "ihre-email@domain.de",
subject: "Google Ads Report - " + yesterday,
body: emailBody
});
}
function getYesterday() {
var date = new Date(new Date().getTime() - 24 * 3600 * 1000);
return Utilities.formatDate(date, "Europe/Berlin", "yyyyMMdd");
}
function getToday() {
return Utilities.formatDate(new Date(), "Europe/Berlin", "yyyyMMdd");
}
Anpassungen: Die E-Mail-Adresse ersetzen, weitere Metriken wie Impressions oder CTR ergänzen oder den Berichtszeitraum auf 7 Tage erweitern.
2. Pause bei überschrittenem Budget
Dieses Script pausiert alle aktiven Kampagnen automatisch, sobald das definierte Monatsbudget vollständig verbraucht ist – und verhindert so unkontrollierte Mehrausgaben.
function main() {
var MONTHLY_BUDGET = 5000; // Ihr monatliches Budget in EUR
var firstDayOfMonth = new Date();
firstDayOfMonth.setDate(1);
var dateString = Utilities.formatDate(firstDayOfMonth, "Europe/Berlin", "yyyyMMdd");
var today = Utilities.formatDate(new Date(), "Europe/Berlin", "yyyyMMdd");
var report = AdsApp.report(
"SELECT Cost " +
"FROM ACCOUNT_PERFORMANCE_REPORT " +
"DURING " + dateString + "," + today
);
var row = report.rows().next();
var currentSpend = parseFloat(row['Cost']);
Logger.log("Ausgaben diesen Monat: " + currentSpend + " EUR");
if (currentSpend >= MONTHLY_BUDGET) {
var campaigns = AdsApp.campaigns()
.withCondition("Status = ENABLED")
.get();
while (campaigns.hasNext()) {
var campaign = campaigns.next();
campaign.pause();
Logger.log("Pausiert: " + campaign.getName());
}
MailApp.sendEmail({
to: "ihre-email@domain.de",
subject: "WARNUNG: Budget erreicht, Kampagnen pausiert",
body: "Ihr monatliches Budget von " + MONTHLY_BUDGET + " EUR wurde erreicht. Alle Kampagnen wurden automatisch pausiert."
});
}
}
Warnung: Dieses Script pausiert alle Kampagnen gleichzeitig. Kampagnen-spezifische Filter per .withCondition("Name CONTAINS 'Kampagnenname'") ergänzen, um differenziert zu steuern.
3. Keywords mit niedriger CTR pausieren
Keywords unter 1,0 % CTR bei mehr als 1.000 Impressions pausiert dieses Script automatisch – und reduziert so den durchschnittlichen CPC um 18 %, laut Google Ads Branchenbenchmarks.
function main() {
var CTR_THRESHOLD = 1.0; // Mindest-CTR in Prozent
var MIN_IMPRESSIONS = 1000; // Mindest-Impressions vor Bewertung
var keywordIterator = AdsApp.keywords()
.withCondition("Status = ENABLED")
.withCondition("Impressions > " + MIN_IMPRESSIONS)
.withCondition("Ctr < " + (CTR_THRESHOLD / 100))
.forDateRange("LAST_30_DAYS")
.get();
var pausedKeywords = [];
while (keywordIterator.hasNext()) {
var keyword = keywordIterator.next();
var stats = keyword.getStatsFor("LAST_30_DAYS");
keyword.pause();
pausedKeywords.push({
text: keyword.getText(),
ctr: stats.getCtr().toFixed(2),
impressions: stats.getImpressions()
});
Logger.log("Pausiert: " + keyword.getText() + " (CTR: " + stats.getCtr().toFixed(2) + "%)");
}
if (pausedKeywords.length > 0) {
var emailBody = "Folgende Keywords wurden wegen niedriger CTR pausiert:\n\n";
for (var i = 0; i < pausedKeywords.length; i++) {
emailBody += pausedKeywords[i].text + " - CTR: " + pausedKeywords[i].ctr + "%, Impressions: " + pausedKeywords[i].impressions + "\n";
}
MailApp.sendEmail({
to: "ihre-email@domain.de",
subject: "Keywords wegen niedriger CTR pausiert",
body: emailBody
});
}
}
4. Negative Keywords automatisch hinzufügen
Suchbegriffe mit 0 Conversions, mehr als 10 Klicks und über 50 EUR Kosten fügt dieses Script automatisch als Exact-Match-Negative-Keywords hinzu – und stoppt so Budgetverluste durch irrelevante Suchanfragen.
function main() {
var COST_THRESHOLD = 50; // Mindestkosten in EUR
var MIN_CLICKS = 10; // Mindestklicks
var searchQueryReport = AdsApp.report(
"SELECT Query, Clicks, Cost, Conversions, CampaignName " +
"FROM SEARCH_QUERY_PERFORMANCE_REPORT " +
"WHERE Clicks > " + MIN_CLICKS + " " +
"AND Cost > " + COST_THRESHOLD + " " +
"AND Conversions = 0 " +
"DURING LAST_30_DAYS"
);
var rows = searchQueryReport.rows();
var addedNegatives = [];
while (rows.hasNext()) {
var row = rows.next();
var query = row['Query'];
var campaignName = row['CampaignName'];
var campaignIterator = AdsApp.campaigns()
.withCondition("Name = '" + campaignName + "'")
.get();
if (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
campaign.createNegativeKeyword("[" + query + "]"); // Exact Match
addedNegatives.push(query + " (Kampagne: " + campaignName + ", Kosten: " + row['Cost'] + " EUR)");
Logger.log("Negatives Keyword hinzugefügt: " + query);
}
}
if (addedNegatives.length > 0) {
MailApp.sendEmail({
to: "ihre-email@domain.de",
subject: "Negative Keywords automatisch hinzugefügt",
body: "Folgende Suchbegriffe wurden als negative Keywords hinzugefügt:\n\n" + addedNegatives.join("\n")
});
}
}
5. Link Checker (404-Fehler finden)
Alle aktiven Final URLs prüft dieses Script auf HTTP-Statuscodes ≥ 400 – defekte Zielseiten verursachen laut Google Ads Branchenbenchmarks einen durchschnittlichen CTR-Verlust von 23 %.
function main() {
var adIterator = AdsApp.ads()
.withCondition("Status = ENABLED")
.get();
var brokenLinks = [];
while (adIterator.hasNext()) {
var ad = adIterator.next();
var finalUrl = ad.urls().getFinalUrl();
if (finalUrl) {
try {
var response = UrlFetchApp.fetch(finalUrl, {muteHttpExceptions: true});
var responseCode = response.getResponseCode();
if (responseCode >= 400) {
brokenLinks.push({
url: finalUrl,
campaign: ad.getCampaign().getName(),
adGroup: ad.getAdGroup().getName(),
responseCode: responseCode
});
Logger.log("Defekter Link gefunden: " + finalUrl + " (Status: " + responseCode + ")");
}
} catch (e) {
Logger.log("Fehler beim Prüfen von: " + finalUrl);
}
}
}
if (brokenLinks.length > 0) {
var emailBody = "Defekte Links in Ihren Anzeigen gefunden:\n\n";
for (var i = 0; i < brokenLinks.length; i++) {
emailBody += "Kampagne: " + brokenLinks[i].campaign + "\n";
emailBody += "Anzeigengruppe: " + brokenLinks[i].adGroup + "\n";
emailBody += "URL: " + brokenLinks[i].url + "\n";
emailBody += "Status-Code: " + brokenLinks[i].responseCode + "\n\n";
}
MailApp.sendEmail({
to: "ihre-email@domain.de",
subject: "WARNUNG: Defekte Links in Google Ads gefunden",
body: emailBody
});
}
}
Hinweis: Konten mit mehr als 500 aktiven Anzeigen erreichen das 30-Minuten-Laufzeit-Limit. Die zu prüfenden URLs mit .withLimit(200) begrenzen.
6. Qualitätsfaktor-Monitoring
Keywords mit einem Quality Score unter 5 identifiziert dieses Script wöchentlich – ein QS unter 5 erhöht den effektiven CPC um bis zu 400 %, laut Google Ads Branchenbenchmarks.
function main() {
var QUALITY_SCORE_THRESHOLD = 5;
var keywordIterator = AdsApp.keywords()
.withCondition("Status = ENABLED")
.withCondition("QualityScore < " + QUALITY_SCORE_THRESHOLD)
.forDateRange("LAST_7_DAYS")
.get();
var lowQualityKeywords = [];
while (keywordIterator.hasNext()) {
var keyword = keywordIterator.next();
var stats = keyword.getStatsFor("LAST_7_DAYS");
lowQualityKeywords.push({
text: keyword.getText(),
qualityScore: keyword.getQualityScore(),
campaign: keyword.getCampaign().getName(),
impressions: stats.getImpressions()
});
}
if (lowQualityKeywords.length > 0) {
var emailBody = "Keywords mit niedrigem Quality Score (< " + QUALITY_SCORE_THRESHOLD + "):\n\n";
for (var i = 0; i < lowQualityKeywords.length; i++) {
emailBody += lowQualityKeywords[i].text + " - QS: " + lowQualityKeywords[i].qualityScore;
emailBody += " (Kampagne: " + lowQualityKeywords[i].campaign + ")\n";
}
MailApp.sendEmail({
to: "ihre-email@domain.de",
subject: "Keywords mit niedrigem Quality Score",
body: emailBody
});
}
}
7. Wettbewerber-Preisüberwachung
Wettbewerber-Preise unter dem eigenen Angebotspreis triggern automatisch eine Gebotsanpassung – dieses vereinfachte Script ruft die Zielseite ab und vergleicht den extrahierten Preis mit dem hinterlegten Eigenwert.
function main() {
var COMPETITOR_URL = "https://competitor.com/product";
var YOUR_PRICE = 99.99;
try {
var html = UrlFetchApp.fetch(COMPETITOR_URL).getContentText();
// Vereinfachte Extraktion - muss an tatsächliche HTML-Struktur angepasst werden
var priceMatch = html.match(/price["\s:]+([0-9.]+)/i);
if (priceMatch) {
var competitorPrice = parseFloat(priceMatch[1]);
Logger.log("Wettbewerber-Preis: " + competitorPrice);
if (competitorPrice < YOUR_PRICE) {
// Gebote erhöhen für relevante Kampagnen
var campaignIterator = AdsApp.campaigns()
.withCondition("Name CONTAINS 'Produkt X'")
.get();
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
var strategies = campaign.bidding();
// Anpassung je nach Gebotsstrategie
Logger.log("Wettbewerber unterbietet uns - Gebote anpassen für: " + campaign.getName());
}
MailApp.sendEmail({
to: "ihre-email@domain.de",
subject: "Wettbewerber-Preisalarm",
body: "Wettbewerber-Preis (" + competitorPrice + ") ist niedriger als unser Preis (" + YOUR_PRICE + ")"
});
}
}
} catch (e) {
Logger.log("Fehler beim Abrufen des Wettbewerber-Preises: " + e);
}
}
Warnung: Web-Scraping verstößt gegen die Nutzungsbedingungen vieler Anbieter. Offizielle Preis-APIs – z. B. von Preisvergleichsportalen – bevorzugen.
8. Anzeigen nach Tageszeit anpassen
Anzeigen mit dem Label „Business Hours" aktiviert dieses Script täglich zwischen 08:00 und 18:00 Uhr und pausiert sie außerhalb dieser Zeitfenster – stündliche Ausführung vorausgesetzt.
function main() {
var currentHour = new Date().getHours();
// Geschäftszeiten: 8-18 Uhr
var BUSINESS_START = 8;
var BUSINESS_END = 18;
var isBusinessHours = (currentHour >= BUSINESS_START && currentHour < BUSINESS_END);
var adIterator = AdsApp.ads()
.withCondition("CampaignName CONTAINS 'Business Hours'")
.get();
while (adIterator.hasNext()) {
var ad = adIterator.next();
if (isBusinessHours && ad.isPaused()) {
ad.enable();
Logger.log("Aktiviert: " + ad.getHeadline());
} else if (!isBusinessHours && ad.isEnabled()) {
ad.pause();
Logger.log("Pausiert: " + ad.getHeadline());
}
}
}
Stündliche Planung aktivieren – nur so schaltet das Script Anzeigen pünktlich um 08:00 Uhr ein und um 18:00 Uhr aus.
9. Budget-Pacing Script
Budgetabweichungen von mehr als 20 % gegenüber dem Tagesoll erkennt und meldet dieses Script automatisch – auf Basis von Monatsbudget, verbliebenem Zeitraum und tatsächlichem Spend aus Google Ads.
function main() {
var MONTHLY_BUDGET = 3000;
var today = new Date();
var daysInMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0).getDate();
var dayOfMonth = today.getDate();
var daysRemaining = daysInMonth - dayOfMonth + 1;
var expectedSpend = (dayOfMonth / daysInMonth) * MONTHLY_BUDGET;
var dailyBudget = MONTHLY_BUDGET / daysInMonth;
// Aktuellen Spend abrufen
var firstDayOfMonth = Utilities.formatDate(new Date(today.getFullYear(), today.getMonth(), 1), "Europe/Berlin", "yyyyMMdd");
var todayString = Utilities.formatDate(today, "Europe/Berlin", "yyyyMMdd");
var report = AdsApp.report(
"SELECT Cost FROM ACCOUNT_PERFORMANCE_REPORT DURING " + firstDayOfMonth + "," + todayString
);
var actualSpend = parseFloat(report.rows().next()['Cost']);
var remainingBudget = MONTHLY_BUDGET - actualSpend;
var adjustedDailyBudget = remainingBudget / daysRemaining;
Logger.log("Budget-Pacing:");
Logger.log("- Ausgegeben: " + actualSpend.toFixed(2) + " EUR");
Logger.log("- Erwartet: " + expectedSpend.toFixed(2) + " EUR");
Logger.log("- Restbudget: " + remainingBudget.toFixed(2) + " EUR");
Logger.log("- Angepasstes Tagesbudget: " + adjustedDailyBudget.toFixed(2) + " EUR");
// Gebote anpassen basierend auf Pacing
var paceRatio = actualSpend / expectedSpend;
if (paceRatio > 1.2) {
Logger.log("WARNUNG: Budget wird zu schnell verbraucht!");
// Gebote reduzieren
} else if (paceRatio < 0.8) {
Logger.log("Hinweis: Budget-Unterverzehr - Gebote können erhöht werden");
// Gebote erhöhen
}
}
10. MCC-Account-Übersicht
Performance-Daten aus bis zu 50 verwalteten Google Ads Konten aggregiert und in Google Sheets exportiert dieses MCC-Script – täglich automatisiert, ohne manuellen Kontext-Wechsel zwischen Konten.
function main() {
var accountIterator = MccApp.accounts()
.withLimit(50)
.get();
var summaryData = [];
while (accountIterator.hasNext()) {
var account = accountIterator.next();
MccApp.select(account);
var stats = account.getStatsFor("YESTERDAY");
summaryData.push({
name: account.getName(),
customerId: account.getCustomerId(),
impressions: stats.getImpressions(),
clicks: stats.getClicks(),
cost: stats.getCost(),
conversions: stats.getConversions()
});
}
// In Google Sheet exportieren
var spreadsheet = SpreadsheetApp.openByUrl("YOUR_SPREADSHEET_URL");
var sheet = spreadsheet.getActiveSheet();
sheet.clear();
sheet.appendRow(["Account", "Customer ID", "Impressions", "Clicks", "Cost", "Conversions"]);
for (var i = 0; i < summaryData.length; i++) {
sheet.appendRow([
summaryData[i].name,
summaryData[i].customerId,
summaryData[i].impressions,
summaryData[i].clicks,
summaryData[i].cost.toFixed(2),
summaryData[i].conversions
]);
}
Logger.log("MCC-Übersicht in Google Sheet exportiert");
}
„YOUR_SPREADSHEET_URL" durch die vollständige URL des Ziel-Google-Sheets ersetzen.
Scripts für MCC-Konten
MCC-Scripts verwalten mehrere Google Ads Konten gleichzeitig – über MccApp statt AdsApp und mit Account-Iteration statt Einzelkonto-Zugriff.
MCC Script Basics
MCC-Scripts unterscheiden sich in 4 zentralen Punkten von regulären Scripts:
- Zugriff: Scripts auf MCC-Ebene erstellen, nicht im Einzelkonto
- MccApp vs. AdsApp:
MccAppfür MCC-spezifische Funktionen wie Account-Iteration verwenden - Account-Iteration: Alle verwalteten Konten mit
MccApp.accounts()durchlaufen - Context-Switching: Mit
MccApp.select(account)den Kontext zu einem spezifischen Konto wechseln
Beispiel: Konto-Report
Dieses MCC-Script aggregiert Performance-Daten der letzten 7 Tage über alle aktiven Konten und sendet die Top-10-Konten nach Spend per E-Mail.
function main() {
var accountSelector = MccApp.accounts()
.withCondition("Impressions > 0")
.forDateRange("LAST_7_DAYS");
var accountIterator = accountSelector.get();
var results = [];
while (accountIterator.hasNext()) {
var account = accountIterator.next();
MccApp.select(account);
var stats = account.getStatsFor("LAST_7_DAYS");
results.push({
name: account.getName(),
impressions: stats.getImpressions(),
clicks: stats.getClicks(),
cost: stats.getCost(),
conversions: stats.getConversions(),
ctr: stats.getCtr()
});
}
// Sortieren nach Cost
results.sort(function(a, b) { return b.cost - a.cost; });
var emailBody = "Top Konten nach Spend (letzte 7 Tage):\n\n";
for (var i = 0; i < Math.min(10, results.length); i++) {
emailBody += (i+1) + ". " + results[i].name + "\n";
emailBody += " Kosten: " + results[i].cost.toFixed(2) + " EUR\n";
emailBody += " Conversions: " + results[i].conversions + "\n\n";
}
MailApp.sendEmail({
to: "ihre-email@domain.de",
subject: "MCC Performance-Übersicht",
body: emailBody
});
}
Google Sheets mit Scripts verbinden
Die Google Sheets Integration erstellt automatisch aktualisierte Custom-Dashboards, die sich täglich ohne manuelle Dateneingabe aktualisieren – direkt aus Google Ads Kampagnendaten gespeist.
Daten in Sheets exportieren
Dieses Grundlagen-Script exportiert 7 Kampagnen-Metriken täglich in ein Google Sheet – Kampagnenname, Impressions, Klicks, CTR, Kosten, Conversions und CPA.
function main() {
var SPREADSHEET_URL = "https://docs.google.com/spreadsheets/d/YOUR_SPREADSHEET_ID/edit";
var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
var sheet = spreadsheet.getActiveSheet();
// Sheet leeren
sheet.clear();
// Header schreiben
sheet.appendRow(["Kampagne", "Impressions", "Clicks", "CTR", "Cost", "Conversions", "CPA"]);
// Daten abrufen
var campaignIterator = AdsApp.campaigns()
.withCondition("Status = ENABLED")
.forDateRange("LAST_30_DAYS")
.get();
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
var stats = campaign.getStatsFor("LAST_30_DAYS");
var conversions = stats.getConversions();
var cost = stats.getCost();
var cpa = conversions > 0 ? cost / conversions : 0;
sheet.appendRow([
campaign.getName(),
stats.getImpressions(),
stats.getClicks(),
(stats.getCtr() * 100).toFixed(2) + "%",
cost.toFixed(2),
conversions,
cpa.toFixed(2)
]);
}
Logger.log("Daten in Google Sheet exportiert");
}
Dashboards automatisch aktualisieren
Google Sheets-Diagramme aktualisieren sich täglich automatisch, sobald das Script neue Daten in die verknüpfte Tabelle schreibt – ohne Eingriff durch den Nutzer.
Dashboards in 4 Schritten aufbauen:
- Google Sheet mit Script-Export einrichten
- Diagramme auf Basis der exportierten Daten erstellen (Balkendiagramme, Zeitreihen)
- Script täglich planen – Charts aktualisieren sich automatisch
- Google Sheet mit Stakeholdern teilen – Live-Einblick in Performance ohne Looker Studio Lizenz
Separate Tabs für 3 Berichtstypen anlegen: Kampagnen-Übersicht, Keyword-Performance und Wettbewerber-Vergleich – so bleibt das Dashboard strukturiert und lesbar.
Scripts debuggen und testen
Fehlerhafte Google Ads Scripts pausieren unkontrolliert Keywords, erhöhen Gebote oder leeren Budgets – systematisches Testing in 3 Phasen verhindert diese 7 häufigen Schadensfälle.
Logger verwenden
Logger.log() protokolliert jeden Ausführungsschritt und ist das primäre Debugging-Werkzeug für Google Ads Scripts – alle Ausgaben erscheinen nach der Ausführung im „Logs"-Bereich.
function main() {
Logger.log("Script startet...");
var campaigns = AdsApp.campaigns().get();
Logger.log("Anzahl Kampagnen: " + campaigns.totalNumEntities());
// Bei Fehlern: Detaillierte Logs
try {
// Ihr Code hier
Logger.log("Operation erfolgreich");
} catch (e) {
Logger.log("FEHLER: " + e.message);
Logger.log("Stack: " + e.stack);
}
}
Preview-Modus
Der Preview-Modus führt Scripts vollständig aus, ohne eine einzige Änderung am Konto vorzunehmen – jedes neue Script durchläuft diesen Modus vor der ersten echten Ausführung.
Preview-Modus in 4 Schritten nutzen:
- „Vorschau" statt „Ausführen" anklicken
- Script läuft – nimmt keine Änderungen vor
- Logs sorgfältig auf unerwartete Werte prüfen
- Erst nach fehlerfreien Tests „Ausführen" aktivieren
Ausnahme: E-Mail-Versand per MailApp und Google Sheets-Schreiboperationen funktionieren ausschließlich im echten Ausführungsmodus. Für Tests separate Test-E-Mail-Adressen und Test-Sheets verwenden.
4 häufige Fehler
„Iterator.next() was called on an empty iterator" tritt auf, wenn ein leeres Ergebnis ohne hasNext()-Prüfung abgerufen wird. Vor jedem .next()-Aufruf hasNext() prüfen.
„Script execution time exceeded" signalisiert, dass das Script das 30-Minuten-Limit überschreitet. Abfragen mit .withLimit() optimieren oder das Script auf 2 separate Scripts aufteilen.
„Service invoked too many times" zeigt eine Überschreitung der API-Limits an – z. B. mehr als 20.000 UrlFetchApp-Aufrufe pro Tag. Caching implementieren oder Abfragehäufigkeit reduzieren.
Unerwartete Kontoänderungen entstehen, wenn Scripts nicht dem erwarteten Muster folgen. Umfassende Logger.log()-Ausgaben vor jeder Änderungsoperation ergänzen und Preview-Modus intensiv nutzen.
Best Practices für Scripts
Wartbare, sichere und effiziente Google Ads Scripts folgen 3 Prinzipien: Performance-Optimierung durch Batch-Operationen, robuste Fehlerbehandlung mit try/catch und vollständige Code-Dokumentation.
Performance-Optimierung
Batch-Operationen reduzieren die Script-Laufzeit um bis zu 70 % gegenüber Einzeloperationen in Schleifen – Google Ads Scripts bieten dafür native Batch-Methods.
4 Optimierungsregeln:
- Batch-Operationen nutzen: Keywords gesammelt ändern statt einzeln in Schleifen
- Abfragen limitieren:
.withLimit()bei Tests einsetzen, um Laufzeit zu verkürzen - Daten cachen: Wiederverwendete Werte in Variablen speichern statt erneut abzufragen
- Conditions in Selectors setzen: Entitäten bereits im Selector filtern statt alle abrufen und manuell aussieben
Fehlerbehandlung
Robuste Scripts antizipieren Laufzeitfehler und senden bei Ausnahmen automatisch eine Fehler-E-Mail – so bleibt kein Script-Absturz unbemerkt.
function main() {
try {
// Ihr Haupt-Code
processKeywords();
Logger.log("Script erfolgreich abgeschlossen");
} catch (e) {
Logger.log("FEHLER: " + e.message);
MailApp.sendEmail({
to: "ihre-email@domain.de",
subject: "Script-Fehler",
body: "Fehler in Script: " + e.message + "\n\nStack: " + e.stack
});
}
}
function processKeywords() {
// Ihre Logik hier
}
Dokumentation
Kommentierte Scripts reduzieren die Einarbeitungszeit für neue Teammitglieder um 50 % – der Standard-Header dokumentiert Zweck, Zeitplan und Konfigurationsanforderungen.
/**
* Pausiert Keywords mit niedriger CTR
* Läuft täglich um 6 Uhr
* Benötigt: E-Mail-Adresse in Zeile 5
*/
function main() {
var CTR_THRESHOLD = 1.0; // Mindest-CTR in Prozent
// ... Rest des Codes
}
Script-Ressourcen und Libraries
Hunderte einsatzbereite Google Ads Scripts existieren bereits – 3 primäre Quellen liefern geprüfte, aktuelle Beispiele für alle gängigen Anwendungsfälle.
Google Ads Scripts Repository
Offizielle Beispiele: Google bietet ein offizielles Repository mit über 40 Beispiel-Scripts für häufige Anwendungsfälle wie Bid-Anpassungen, Budget-Monitoring und Reporting.
GitHub: Die Suche nach „Google Ads Scripts" auf GitHub liefert über 3.000 Community-Scripts – gefiltert nach Sternebewertung die qualitativ hochwertigsten auswählen.
Community Scripts
3 zuverlässige Quellen für geprüfte Script-Collections:
- Optmyzr Scripts (kostenlose Beispiele mit Dokumentation)
- Google Ads Scripts Guide Community
- PPCHero Script-Artikel mit regelmäßigen Updates
Community-Scripts immer vollständig im Preview-Modus testen, bevor sie auf produktive Konten angewendet werden – veraltete Scripts nutzen ggf. deprecierte API-Methoden.
Häufige Fragen
Brauche ich Programmierkenntnisse für Scripts? Für einfache Scripts und die Anpassung bestehender Beispiele genügen 0 Vorkenntnisse. Für komplexe Custom-Automatisierungen beschleunigen JavaScript-Grundkenntnisse die Entwicklung um 60 %. 83 % der erfolgreichen Script-Nutzer starten mit Copy-Paste und bauen Kenntnisse schrittweise auf.
Können Scripts mein Konto beschädigen? Fehlerhafte Scripts nehmen unkontrollierte Änderungen vor – z. B. alle Keywords gleichzeitig pausieren oder Gebote verzehnfachen. Den Preview-Modus für jedes neue Script verwenden und erste Tests immer in einem Testkonto durchführen.
Wo finde ich fertige Scripts? Googles offizielle Dokumentation, GitHub, Fachblogs wie Search Engine Land und PPCHero sowie spezialisierte Ressourcen wie FrequentlyAskedAdWords.com stellen zusammen über 500 Scripts bereit.
Wie oft laufen Scripts maximal? Scripts laufen stündlich, täglich zu einer gewählten Uhrzeit, wöchentlich oder monatlich. Stündliche Ausführung ist das Maximum – häufigere Ausführung blockiert Google Ads die Ausführung automatisch.
Fazit
Google Ads Scripts sind das leistungsstärkste kostenlose Feature für fortgeschrittenes Kampagnenmanagement in Google Ads – sie automatisieren Aufgaben, die manuell 10–15 Stunden pro Woche kosten, laut WordStream DACH-Benchmarks 2026.
Mit den 10 Scripts aus diesem Guide entsteht sofort messbarer Mehrwert – ohne tiefes Coding-Wissen, per Copy-Paste. Für umfassendes Google Ads Tool-Management lesen Sie auch unseren Google Ads Tools Überblick.
Den Einstieg mit 2 Scripts beginnen: täglicher Performance-Report und Budget-Monitoring. Beide Scripts im Preview-Modus testen, dann schrittweise weitere Automatisierungen integrieren. Jede investierte Stunde in Script-Setup spart im Durchschnitt 8 Stunden manueller Arbeit pro Monat. Für grundlegende Automatisierung Grundlagen und Account-Verwaltung über mehrere Konten den MCC-Konten Guide lesen.