Spare dir pro Woche mehr als 2 Stunden Zeit
Anleitung: Google Apps Script für Indexierungs- & Performance-Check von URLs in Google Sheets (GSC + Indexing API)
📖 Teil der Google Search Console & Google Tools Serie:
- Google Search Console Login
- Ein Google-Konto einrichten – Anleitung
- Google Search Console – Ein Überblick
- Google Search Console Nutzer hinzufügen – Schritt-für-Schritt
- Google Search Console Indexing Performance Checker (Skript)
- Google Search Console & BigQuery verbinden – Anleitung
- Technisches SEO: 404-Fehler finden mit Google Funktionen
- Seite mit Weiterleitung in der Google Search Console
Diese Anleitung zeigt dir Schritt für Schritt, wie du mit Google Apps Script den Indexierungsstatus und die Performance-Daten (Klicks, Impressionen, CTR, Position) mehrerer URLs aus der Google Search Console abfragen kannst. Das Ganze geschieht direkt über ein Google Sheet, z. B. namens „URLs„.
Voraussetzungen
Im Youtube Video sind alle Details dazu.
- Google Search Console-Zugriff auf deine Domain (z. B.
sc-domain:deine-domain.tld
) - Google Cloud-Projekt mit aktivierter
Indexing API
undSearch Console API
- Service Account mit JSON-Schlüssel (
private_key
&client_email
):- Gehe zu: https://console.cloud.google.com/iam-admin/serviceaccounts
- Wähle dein Projekt aus (oben in der blauen Leiste)
- Klicke auf den Service Account, den du erstellt hast (z. B.
gsc-index-bot@...
) - Gehe in den Reiter „Schlüssel“
- Klicke auf „Schlüssel hinzufügen > Neuen Schlüssel erstellen“
- Wähle „JSON“ als Format
- Klicke auf „Erstellen“
🔽 Die Datei wird jetzt automatisch heruntergeladen (*.json
)
- Der
client_email
Wert muss in der GSC-Property als Nutzer mit Zugriff eingetragen sein
Anleitung
Schritt 1: Google Sheet anlegen
Hier Template kopieren: https://docs.google.com/spreadsheets/d/1_J9mHgJCW6pgdStwllSk8eYa-dDglsMwCOecu05vS5Q/edit?gid=497916964#gid=497916964
oder selber erstellen:
- Öffne Google Drive
- Erstelle ein neues Google Sheet mit dem Namen „Indexing Checker„ (oder ein beliebiger Name)
- Trage in Spalte A (ab A2) die zu prüfenden URLs ein
- Die Spalten B bis J werden automatisch vom Script befüllt
Schritt 2: Apps Script Projekt erstellen
- Gehe zu Extensions im Sheet.
- Klicke auf „Neues Projekt“
- Gib dem Projekt einen Namen (z. B. „GSC Sheet Check“)
Schritt 3: Skripteigenschaften definieren
- Gehe auf Datei > Projekt-Eigenschaften > Skripteigenschaften
- Trage zwei Einträge ein:
PRIVATE_KEY
: der Inhalt deinesprivate_key
aus der JSON-Datei (mit\n
statt echten Zeilenumbrüchen)CLIENT_EMAIL
: dieclient_email
aus deiner JSON-Datei
Schritt 4: Google Sheet vorbereiten
- Erstelle ein Google Sheet (z. B. mit dem Namen „URLs“)
- Trage in Spalte A (ab A2) die zu prüfenden URLs ein
- Die Ergebnisse erscheinen automatisch in den Spalten B bis J
Schritt 5: Code einfügen
Kopiere den folgenden Code in den Apps Script Editor.
Ersetze ggf. Sheet-Namen und Domain-Property:
const PRIVATE_KEY = PropertiesService.getScriptProperties().getProperty("PRIVATE_KEY");
const CLIENT_EMAIL = PropertiesService.getScriptProperties().getProperty("CLIENT_EMAIL");
const sheet_name = "URLs"
function checkIndexStatusWithAPI() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name); // ggf. Sheet-Name anpassen
const urls = sheet.getRange("A2:A" + sheet.getLastRow()).getValues();
const jwt = createJWT_(CLIENT_EMAIL, PRIVATE_KEY);
const token = getAccessToken_(jwt);
for (let i = 0; i < urls.length; i++) {
const row = i + 2;
const url = urls[i][0];
if (!url) continue;
const status = sheet.getRange(row, 6).getValue();
if (status === "✅ Done") continue;
sheet.getRange(row, 6).setValue(`🔁 (${i + 1} / ${urls.length})`);
try {
const result = inspectURLStatusFull_(url, token);
sheet.getRange(row, 2).setValue(result.coverage || "N/A");
sheet.getRange(row, 3).setValue(result.pageFetch || "N/A");
sheet.getRange(row, 4).setValue(result.lastCrawl || "N/A");
sheet.getRange(row, 5).setValue(result.robotsTxt || "N/A");
const perf = getPerformanceDataForUrl(url, token);
sheet.getRange(row, 7).setValue(perf.clicks);
sheet.getRange(row, 8).setValue(perf.impressions);
sheet.getRange(row, 9).setValue(perf.ctr);
sheet.getRange(row, 10).setValue(perf.position);
sheet.getRange(row, 6).setValue("✅ Done");
} catch (error) {
sheet.getRange(row, 2).setValue("❌ Error");
sheet.getRange(row, 6).setValue(error.message);
}
Utilities.sleep(1500);
}
}
function createJWT_(email, rawKey) {
const privateKey = rawKey.replace(/\\n/g, '\n');
const header = { alg: "RS256", typ: "JWT" };
const now = Math.floor(Date.now() / 1000);
const payload = {
iss: email,
scope: "https://www.googleapis.com/auth/indexing https://www.googleapis.com/auth/webmasters",
aud: "https://oauth2.googleapis.com/token",
exp: now + 3600,
iat: now
};
const encode = obj => Utilities.base64EncodeWebSafe(JSON.stringify(obj));
const toSign = encode(header) + "." + encode(payload);
const signature = Utilities.computeRsaSha256Signature(toSign, privateKey);
return toSign + "." + Utilities.base64EncodeWebSafe(signature);
}
function getAccessToken_(jwt) {
const options = {
method: "post",
payload: {
grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
assertion: jwt
}
};
const response = UrlFetchApp.fetch("https://oauth2.googleapis.com/token", options);
const json = JSON.parse(response.getContentText());
return json.access_token;
}
function inspectURLStatusFull_(url, token) {
const payload = {
inspectionUrl: url,
siteUrl: "https://antonioblago.de/", // <-- HIER deine GSC-Property einsetzen
languageCode: "en-US"
};
const options = {
method: "post",
contentType: "application/json",
headers: {
Authorization: `Bearer ${token}`
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
const res = UrlFetchApp.fetch("https://searchconsole.googleapis.com/v1/urlInspection/index:inspect", options);
const data = JSON.parse(res.getContentText());
try {
const result = data.inspectionResult.indexStatusResult;
return {
coverage: result.coverageState,
pageFetch: result.pageFetchState,
lastCrawl: result.lastCrawlTime,
robotsTxt: result.robotsTxtState
};
} catch (e) {
return {
coverage: data.error?.message || "Error parsing",
pageFetch: "",
lastCrawl: "",
robotsTxt: ""
};
}
}
function getPerformanceDataForUrl(url, token) {
const endDate = new Date();
const startDate = new Date();
startDate.setDate(endDate.getDate() - 28);
const payload = {
startDate: Utilities.formatDate(startDate, Session.getScriptTimeZone(), "yyyy-MM-dd"),
endDate: Utilities.formatDate(endDate, Session.getScriptTimeZone(), "yyyy-MM-dd"),
dimensions: ["page"],
dimensionFilterGroups: [{
filters: [{
dimension: "page",
operator: "equals",
expression: url
}]
}],
rowLimit: 1
};
const options = {
method: "post",
contentType: "application/json",
headers: {
Authorization: `Bearer ${token}`
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(
"https://searchconsole.googleapis.com/webmasters/v3/sites/sc-domain:deine-domain.tld/searchAnalytics/query",
options
);
const data = JSON.parse(response.getContentText());
if (data.rows && data.rows.length > 0) {
const row = data.rows[0];
return {
clicks: row.clicks,
impressions: row.impressions,
ctr: (row.ctr * 100).toFixed(2),
position: row.position.toFixed(1)
};
} else {
return {
clicks: 0,
impressions: 0,
ctr: "0.00",
position: "-"
};
}
}
✅ Ergebnis
- Das Script verarbeitet jede URL einzeln
- Schreibt die Indexierungs- und Leistungsdaten direkt in dein Sheet
- Bereits verarbeitete Zeilen werden beim erneuten Start übersprungen (
✅ Done
in Spalte F)
Limitationen
- Maximale Anzahl URL-Inspections pro Tag: Die Google Search Console API URL Inspection erlaubt aktuell 2.000 Anfragen pro Tag und Property.
- Timeout nach 30 Minuten: Google Apps Script bricht nach ca. 30 Minuten ab (bei Workspace-Konten) – bei hunderten URLs muss das Skript ggf. mehrfach manuell erneut gestartet werden.
- URL-Inspektion nur für verifizierte Properties: Nur URLs, die zur eingetragenen GSC-Property gehören (z. B.
sc-domain:deine-domain.tld
), können erfolgreich überprüft werden. - Quota-Limitierungen der Search Console API: Zu viele Anfragen in kurzer Zeit können zu
429
-Fehlern führen – das Skript hat daher einen Sleep von 1,5 Sekunden integriert.
Premium SEO Automation: Indexierung & Performance auf Autopilot
Behalte deine wichtigsten Seiten im Blick – ganz ohne manuelles Tracking.
✅ Automatisiertes Indexierungsmonitoring
Tägliche Prüfung des Indexierungsstatus deiner Top Money Pages. Erkenne sofort Crawling-Probleme oder fehlende Indexierung.
✅ Intelligente SEO-Reports in Google Sheets
Alle relevanten KPIs wie Klicks, Impressionen, CTR und Position automatisch abrufbar – übersichtlich und bereit zur Weiterverarbeitung.
✅ Echtzeit-Sitemap-Synchronisation
Neue URLs werden automatisch erkannt, mit der Sitemap abgeglichen und auf Wunsch direkt an die Google Search Console übermittelt.
✅ Frühwarnsystem bei Traffic-Verlusten
Identifiziere sofort Seiten mit sinkender Performance – bevor Rankings und Umsatz betroffen sind.
✅ Tägliche Reporting-Mails & Performance-Logs
Erhalte automatisierte E-Mail-Reports inkl. Statusübersicht, Fehlerprotokoll und konkreten Handlungsempfehlungen.
✅ Kein Copy-Paste, kein CSV-Import
Alle Prozesse laufen automatisiert – ideal für größere Shops und SEO-Teams mit Fokus auf Skalierung.
✅ 100 % DSGVO-konform & vollständig in deinem Google-Konto
Keine Drittanbieter-Tools, keine Datenweitergabe – maximale Sicherheit und Kontrolle.
Ob für Agenturen oder E-Commerce-Teams
Automatisiere, was dich täglich Zeit kostet – und fokussiere dich auf das, was wirklich zählt: Performance.
Jetzt Demo sichern & SEO smart automatisieren – Hier Termin buchen
Passende weiterführende Links
- Google Search Console einrichten
- Google Big Query einrichten
- 404 Fehler beheben
- E-Mail Kampagne Automatisierungen
- Suchvolumen mit Data4SEO abfragen
Weitere Fragen oder Unterstützung bei der Einrichtung?
Dann helfe dir gerne weiter, einfach hier einen Beratungstermin buchen: https://antonioblago.de/beratung
Sign up hier zu meinem Newsletter um Tipps, Tricks und Hacks rund um SEO, AI und Automatisierung nicht zu verpassen.