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?
| Funktion | Beschreibung | Beispiele |
|---|---|---|
| Daten auslesen | Zugriff auf alle Account-Metriken und Einstellungen | Keywords, Anzeigen, Gebote, Performance-Daten |
| Änderungen vornehmen | Automatische Anpassungen an Kampagnen | Gebote ändern, Keywords pausieren, Labels setzen |
| Reports erstellen | Custom-Berichte in Google Sheets exportieren | Performance-Reports, Quality Score Tracking |
| Benachrichtigungen | E-Mail-Alerts bei bestimmten Ereignissen | Budget-Warnung, Broken URLs, Performance-Drops |
| Externe APIs | Anbindung an externe Dienste | Wetterdaten, 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
| Aufgabe | Manuell | Mit Script | Zeitersparnis |
|---|---|---|---|
| Broken URL Check | 30 min/Woche | Automatisch | 100% |
| Budget-Monitoring | 15 min/Tag | Automatisch | 100% |
| Search Term Review | 2 h/Woche | 30 min/Woche | 75% |
| Performance-Reporting | 1 h/Tag | 5 min/Tag | 92% |
| Quality Score Tracking | 45 min/Woche | Automatisch | 100% |
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
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
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
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
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
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 > 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 > 12) {
alerts.push(campaign.getName() +
": Unterdurchschnittliche Ausgaben (" +
Math.round(spendRatio * 100) + "%)");
}
}
if (alerts.length > 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 > 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 > 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 > 0 " +
"AND Impressions > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 0 ? (cost / conversions).toFixed(2) : "-"
]);
}
if (data.length > 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 > 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 > 0) {
sheet.getRange(sheet.getLastRow() + 1, 1,
currentData.length, currentData[0].length)
.setValues(currentData);
}
// Sende Alerts
if (alerts.length > 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 > 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
| Fehler | Ursache | Lösung |
|---|---|---|
| Timeout exceeded | Script läuft länger als 30 Minuten | Verarbeite weniger Daten pro Lauf, nutze Labels für Batches |
| Authorization required | Fehlende Berechtigungen für API | Script erneut autorisieren, Berechtigungen prüfen |
| Cannot call method of null | Objekt existiert nicht | Prüfe ob Kampagnen/Keywords aktiv sind, füge null-Checks hinzu |
| Quota exceeded | Zu viele API-Aufrufe | Reduziere Aufrufe, nutze Batch-Operationen |
| Invalid date range | Falsches Datumsformat | Nutze 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
| Frequenz | Beste für | Beispiel-Scripts |
|---|---|---|
| Stündlich | Zeitkritisches Monitoring | Budget-Alerts, Broken URL Check, Bid Adjustments |
| Täglich | Routine-Checks und Reports | Performance-Reports, QS-Tracking, Label-Updates |
| Wöchentlich | Optimierungen, tiefe Analysen | Search Term Mining, Wettbewerber-Analyse, Keyword-Pause |
| Monatlich | Strategische Reviews | Performance-Summaries, Budget-Planung |
Zeitplan einrichten
So richtest du einen Zeitplan ein
- Öffne dein Script und klicke auf das Uhr-Symbol
- Wähle "Zeitplan erstellen"
- Wähle Frequenz (Stündlich/Täglich/Wöchentlich/Monatlich)
- Für täglich+: Wähle Uhrzeit (basierend auf Account-Zeitzone)
- Für wöchentlich: Wähle Wochentag
- 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 > 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?▼
Wie lange darf ein Google Ads Script maximal laufen?▼
Kosten Google Ads Scripts etwas?▼
Kann ein Script meinen Account beschädigen?▼
Wie oft sollte ich meine Scripts überprüfen?▼
Funktionieren Scripts auch in MCC-Accounts (Manager-Accounts)?▼
Kann ich mit Scripts auf externe APIs zugreifen?▼
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