Google Ads Scripts: Automatisierung für Fortgeschrittene
Google Ads Scripts sind eine der mächtigsten, aber am wenigsten genutzten Funktionen der Plattform. Sie ermöglichen die Automatisierung komplexer Aufgaben, Custom-Reporting, Echtzeit-Monitoring und vieles mehr – alles mit JavaScript-Code, der direkt in Google Ads läuft. In diesem umfassenden Guide erklären wir, was Scripts sind, wie Sie Ihr erstes Script erstellen und stellen 10 praktische Script-Beispiele vor, die Sie sofort einsetzen können.
Was sind Google Ads Scripts?
Google Ads Scripts bringen Programmierung direkt in Ihre Google Ads Kampagnen. Statt manueller Anpassungen oder teurer Drittanbieter-Tools schreiben Sie Code, der automatisch Optimierungen vornimmt, Berichte erstellt oder Anomalien überwacht.
Definition und Funktionsweise
Scripts sind JavaScript-Programme, die auf Googles Servern laufen und vollständigen Zugriff auf Ihr Google Ads Konto haben. Sie können Kampagnen analysieren, Änderungen vornehmen, Daten exportieren, externe APIs aufrufen und E-Mail-Benachrichtigungen senden.
Wie funktioniert es technisch? Ein Script läuft direkt in der Google Cloud, nicht in Ihrem Browser. Sie schreiben den Code im Google Ads Script-Editor, testen ihn und planen die Ausführung (z.B. täglich um 6 Uhr morgens). Google führt das Script automatisch nach Zeitplan aus – ohne dass Sie online sein müssen.
Was können Scripts tun?
- Kampagnen, Anzeigengruppen, Keywords, Anzeigen lesen und bearbeiten
- Gebote anpassen basierend auf Performance oder externen Daten
- Keywords pausieren, aktivieren oder hinzufügen
- Berichte generieren und per E-Mail versenden oder in Google Sheets exportieren
- Externe APIs abfragen (Wetter, Aktienkurse, eigene Datenbanken)
- Anomalien erkennen (plötzliche Budget-Überschreitungen, Performance-Einbrüche)
- Custom Dashboards in Google Sheets erstellen
Grenzen von Scripts:
- Laufzeit-Limit: 30 Minuten pro Execution (für große Konten kann dies limitierend sein)
- Keine UI-Änderungen – Scripts können nur Daten und Einstellungen ändern, nicht die Google Ads Oberfläche selbst
- Fehlerbehandlung liegt bei Ihnen – fehlerhafte Scripts können Schaden anrichten
- Execution Limits: Scripts können nicht öfter als einmal pro Stunde laufen
JavaScript-Grundlagen für Scripts
Scripts nutzen JavaScript, aber Sie benötigen keine tiefgehende Programmier-Expertise für einfache Automatisierungen. Grundlegendes Verständnis hilft jedoch enorm.
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
Google Ads spezifische Elemente:
AdsApp: Das Hauptobjekt für Zugriff auf Ihr KontoLogger.log(): Ausgabe von Informationen für Debugging- Selectors: Abfragen von Entitäten (z.B.
AdsApp.campaigns().get()) - Iterators: Durchlaufen von Resultaten
- Builders: Erstellen neuer Entitäten
Gute Nachrichten: Die meisten Scripts folgen ähnlichen Mustern. Sie können viele fertige Scripts anpassen, ohne von Grund auf zu programmieren. Copy-Paste mit kleinen Anpassungen führt oft schon zu wertvollen Ergebnissen.
Erstes Script erstellen
Bevor wir zu komplexen Beispielen kommen, erstellen Sie Ihr erstes einfaches Script – einen "Hello World" für Google Ads.
Script-Editor öffnen
- Melden Sie sich bei Google Ads an
- Klicken Sie auf "Tools und Einstellungen" (Schraubenschlüssel-Symbol)
- Unter "Bulk-Aktionen" wählen Sie "Scripts"
- Klicken Sie auf das Plus-Symbol "+ Script"
Sie sehen nun den Script-Editor: Ein Code-Fenster mit Beispiel-Code, Buttons für Vorschau und Ausführung, und Optionen für Planung.
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);
}
Was tut dieses Script?
- Ruft alle aktiven Kampagnen ab
- Geht durch jede Kampagne
- Loggt den Kampagnennamen
- Zählt die Kampagnen und loggt die Gesamtzahl
Vorschau-Modus nutzen:
- Klicken Sie auf "Vorschau" (rechts oben)
- Das Script läuft, nimmt aber KEINE Änderungen vor
- Im "Logs"-Bereich (unten) sehen Sie die Ausgabe
Im Log sollten Sie Ihre Kampagnennamen und die Gesamtzahl sehen. Glückwunsch – Sie haben Ihr erstes Google Ads Script ausgeführt!
Script planen und ausführen
Nachdem das Script im Vorschau-Modus funktioniert:
- Geben Sie dem Script einen Namen (z.B. "Kampagnen-Übersicht")
- Klicken Sie auf "Autorisieren" – Google fragt nach Berechtigung für das Script, auf Ihr Konto zuzugreifen
- Für einmalige Ausführung: Klicken Sie "Ausführen"
- Für automatische Ausführung: Klicken Sie auf "Häufigkeit" und wählen Sie einen Zeitplan (täglich, wöchentlich, stündlich)
Best Practice: Testen Sie neue Scripts immer ausführlich im Vorschau-Modus, bevor Sie sie scharf schalten oder automatisieren.
10 praktische Script-Beispiele
Diese Scripts können Sie kopieren, an Ihre Bedürfnisse anpassen und sofort einsetzen. Jedes Beispiel löst ein reales Problem der Kampagnen-Verwaltung.
1. Täglicher Performance-Report per E-Mail
Automatischer E-Mail-Report mit den wichtigsten Metriken von gestern.
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: Ändern Sie die E-Mail-Adresse, fügen Sie weitere Metriken hinzu oder passen Sie den Zeitraum an.
2. Pause bei überschrittenem Budget
Pausiert Kampagnen automatisch, wenn das Monatsbudget erreicht ist.
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. Für differenzierte Kontrolle fügen Sie Kampagnen-Filter hinzu.
3. Keywords mit niedriger CTR pausieren
Automatisches Pausieren von Keywords mit schlechter Click-Through-Rate.
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
Findet Suchbegriffe mit null Conversions und hohen Kosten und fügt sie als negative Keywords hinzu.
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)
Prüft alle Final URLs auf Erreichbarkeit und meldet defekte Links.
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: Dieses Script kann bei vielen Anzeigen lange laufen. Limitieren Sie ggf. die Anzahl geprüfter URLs.
6. Qualitätsfaktor-Monitoring
Überwacht Quality Score und meldet Verschlechterungen.
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
Scraped Wettbewerber-Preise und passt Gebote entsprechend an (vereinfachtes Beispiel).
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 kann gegen Nutzungsbedingungen verstoßen. Nutzen Sie offizielle APIs wenn verfügbar.
8. Anzeigen nach Tageszeit anpassen
Pausiert oder aktiviert Anzeigen basierend auf Tageszeit.
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());
}
}
}
Tipp: Planen Sie dieses Script stündlich für beste Resultate.
9. Budget-Pacing Script
Überwacht Budget-Verbrauch und passt Gebote an, um gleichmäßige Verteilung zu gewährleisten.
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
Für Manager Accounts: Übersicht über alle verwalteten 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");
}
Anpassung: Ersetzen Sie "YOUR_SPREADSHEET_URL" mit der URL Ihres Google Sheets.
Scripts für MCC-Konten
Manager Accounts (MCC) haben spezielle Script-Features für die Verwaltung mehrerer Konten.
MCC Script Basics
MCC-Scripts unterscheiden sich von regulären Scripts:
Zugriff: Erstellen Sie Scripts auf MCC-Ebene, nicht im Einzel-Konto.
MccApp vs. AdsApp: Nutzen Sie MccApp statt AdsApp für MCC-spezifische Funktionen.
Account-Iteration: Durchlaufen Sie alle verwalteten Konten mit MccApp.accounts().
Context-Switching: Mit MccApp.select(account) wechseln Sie den Kontext zu einem spezifischen Konto.
Beispiel: Konto-Report
Ein MCC-Script, das Performance über alle Konten aggregiert:
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 Integration mit Google Sheets ist eine der mächtigsten Script-Funktionen. Sie erstellen Custom-Dashboards, die automatisch aktualisiert werden.
Daten in Sheets exportieren
Grundlegendes Beispiel für Sheet-Export:
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
Kombinieren Sie Sheet-Export mit Visualisierungen:
- Erstellen Sie ein Google Sheet mit Script-Export
- Fügen Sie Diagramme basierend auf den Daten hinzu (Balkendiagramme, Zeitreihen, etc.)
- Planen Sie das Script täglich – Ihre Charts aktualisieren sich automatisch
- Teilen Sie das Sheet mit Stakeholdern für Live-Einblick in Performance
Tipp: Nutzen Sie verschiedene Tabs im Sheet für unterschiedliche Berichte (Kampagnen-Übersicht, Keyword-Performance, Wettbewerber-Vergleich).
Scripts debuggen und testen
Fehlerhafte Scripts können Schaden anrichten. Systematisches Testing ist essentiell.
Logger verwenden
Logger.log() ist Ihr wichtigstes Debugging-Tool:
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);
}
}
Alle Logs erscheinen im "Logs"-Bereich nach Script-Ausführung.
Preview-Modus
Nutzen Sie IMMER den Preview-Modus für neue Scripts:
- Klicken Sie "Vorschau" statt "Ausführen"
- Das Script läuft, nimmt aber keine Änderungen vor
- Überprüfen Sie Logs sorgfältig
- Erst nach erfolgreichen Tests: "Ausführen"
Exception: Einige Operationen (z.B. E-Mails senden, Sheet-Schreiben) funktionieren nur im echten Ausführungs-Modus. Testen Sie mit Test-E-Mails oder Test-Sheets.
Häufige Fehler
"Iterator.next() was called on an empty iterator"
- Sie versuchen, auf Elemente zuzugreifen, die nicht existieren
- Lösung: Prüfen Sie mit
hasNext()vornext()
"Script execution time exceeded"
- Ihr Script läuft länger als 30 Minuten
- Lösung: Optimieren Sie Abfragen, nutzen Sie Batches, oder teilen Sie Script in mehrere auf
"Service invoked too many times"
- Sie überschreiten API-Limits (z.B. zu viele UrlFetch-Calls)
- Lösung: Implementieren Sie Caching oder reduzieren Sie Abfragen
Unerwartete Änderungen
- Script macht nicht das, was Sie erwarten
- Lösung: Fügen Sie umfassende Logs hinzu, nutzen Sie Preview-Modus intensiv
Best Practices für Scripts
Diese Best Practices helfen, wartbare, sichere und effiziente Scripts zu schreiben.
Performance-Optimierung
Nutzen Sie Batch-Operationen: Statt einzelne Keywords in Schleifen zu ändern, sammeln Sie sie und nutzen Sie Batch-Methods.
Limitieren Sie Abfragen: Nutzen Sie .withLimit() bei Tests, um Laufzeit zu reduzieren.
Cachen Sie wiederverwendete Daten: Wenn Sie dieselben Daten mehrfach nutzen, speichern Sie sie in Variablen statt erneut abzufragen.
Vermeiden Sie unnötige Iterationen: Nutzen Sie Conditions in Selectoren, statt alle Entitäten abzurufen und dann zu filtern.
Fehlerbehandlung
Robuste Scripts antizipieren Fehler:
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
Kommentieren Sie Ihren Code ausführlich:
/**
* 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
}
Zukünftiges Ich (oder Kollegen) danken Ihnen für klare Kommentare.
Script-Ressourcen und Libraries
Sie müssen das Rad nicht neu erfinden. Die Google Ads Scripts Community teilt tausende Scripts.
Google Ads Scripts Repository
Offizielle Beispiele: Google bietet ein offizielles Repository mit dutzenden Beispiel-Scripts für häufige Use Cases.
GitHub: Suchen Sie nach "Google Ads Scripts" auf GitHub für Community-Scripts.
Community Scripts
Free Script Libraries: Verschiedene Agencies und Entwickler teilen Script-Collections:
- Optmyzr Scripts (kostenlose Beispiele)
- Google Ads Scripts Guide Community
- PPCHero Script-Artikel
Achtung: Testen Sie Community-Scripts gründlich. Nicht alle sind gut dokumentiert oder up-to-date.
Häufige Fragen
Brauche ich Programmierkenntnisse für Scripts? Für einfache Scripts und Anpassung existierender Beispiele nicht unbedingt. Für komplexe Custom-Automatisierungen sind JavaScript-Grundkenntnisse hilfreich. Viele erfolgreiche Script-Nutzer haben mit Copy-Paste begonnen und über Zeit gelernt.
Können Scripts mein Konto beschädigen? Ja, fehlerhafte Scripts können unbeabsichtigte Änderungen vornehmen (z.B. alle Keywords pausieren). Nutzen Sie IMMER den Preview-Modus für neue Scripts und testen Sie gründlich in einem Test-Konto.
Wo finde ich fertige Scripts? Googles offizielle Documentation, GitHub, Fachblogs (Search Engine Land, PPCHero) und spezialisierte Websites wie FrequentlyAskedAdWords.com bieten hunderte Scripts.
Wie oft können Scripts laufen? Hourly (jede Stunde), Daily (täglich zu gewählter Zeit), Weekly oder Monthly. Sie können auch manuelle Execution wählen.
Fazit
Google Ads Scripts sind eines der mächtigsten Features für fortgeschrittenes Kampagnen-Management. Sie ermöglichen Automatisierung, Custom-Reporting und Optimierungen, die mit der Standard-Oberfläche unmöglich oder extrem zeitaufwendig wären.
Die Einstiegshürde ist moderat: Mit den Beispiel-Scripts aus diesem Guide können Sie sofort Mehrwert generieren, auch ohne tiefes Coding-Wissen. Je mehr Sie mit Scripts experimentieren, desto mehr Möglichkeiten entdecken Sie. Für umfassendes Google Ads Tool-Management empfehlen wir auch unseren Google Ads Tools Überblick.
Beginnen Sie mit einfachen Scripts (täglicher Report, Budget-Monitoring), testen Sie gründlich im Preview-Modus und erweitern Sie Ihren Automatisierungs-Stack schrittweise. Die Zeit, die Sie in Scripts investieren, zahlt sich durch gesparte Stunden manueller Arbeit und bessere Kampagnen-Performance vielfach aus. Für grundlegende Automatisierung Grundlagen und Account-Verwaltung über mehrere Konten lesen Sie auch unseren MCC-Konten Guide.