Indexing Checker für Google Search Console

Antonio Blago
Antonio Blago
106 Leser 5,0/5 (5)
KI-Zusammenfassung
  • Mit Google Apps Script können Indexierungsstatus und Performance-Daten mehrerer URLs direkt aus der Google Search Console in Google Sheets abgefragt werden.
  • Das Script ermöglicht die automatische Erfassung von Klicks, Impressionen, CTR und Position für bis zu 2.000 URLs pro Tag ohne manuelles Tracking.
  • Die Einrichtung erfordert ein Google Cloud-Projekt mit aktivierter Indexing API, Search Console API und einen Service Account mit JSON-Schlüssel.
  • Das Script überspringt bereits verarbeitete Zeilen beim erneuten Start und verfügt über einen 1,5-Sekunden-Sleep zur Vermeidung von 429-Fehlern bei API-Anfragen.

Automatisch mit KI erstellt, die Details stehen im Artikel.

Inhaltsverzeichnis

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)

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„.

Video-Vorschau

Voraussetzungen

Im Youtube Video sind alle Details dazu.

  1. Google Search Console-Zugriff auf deine Domain (z. B. sc-domain:deine-domain.tld)
  2. Google Cloud-Projekt mit aktivierter Indexing API und Search Console API
  3. 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)
  4. Der client_email Wert muss in der GSC-Property als Nutzer mit Zugriff eingetragen sein
Service Account Schlüssel erstellen

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:

  1. Öffne Google Drive
  2. Erstelle ein neues Google Sheet mit dem Namen „Indexing Checker„ (oder ein beliebiger Name)
  3. Trage in Spalte A (ab A2) die zu prüfenden URLs ein
  4. Die Spalten B bis J werden automatisch vom Script befüllt

Schritt 2: Apps Script Projekt erstellen

  1. Gehe zu Extensions im Sheet.
  2. Klicke auf „Neues Projekt“
  3. Gib dem Projekt einen Namen (z. B. „GSC Sheet Check“)
Apps Script

Schritt 3: Skripteigenschaften definieren

  1. Gehe auf Datei > Projekt-Eigenschaften > Skripteigenschaften
  2. Trage zwei Einträge ein:
    • PRIVATE_KEY: der Inhalt deines private_key aus der JSON-Datei (mit \n statt echten Zeilenumbrüchen)
    • CLIENT_EMAIL: die client_email aus deiner JSON-Datei

Schritt 4: Google Sheet vorbereiten

  1. Erstelle ein Google Sheet (z. B. mit dem Namen „URLs“)
  2. Trage in Spalte A (ab A2) die zu prüfenden URLs ein
  3. 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://www.antonioblago.com//", // <-- 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.

Kurs: WordPress-Umzug richtig machen

Domainwechsel oder Relaunch ohne Traffic-Verlust: Redirect-Map, eigene Redirect-App und Claude-Skill. Aus über 10 Migrationsprojekten, einmalig 149 €.

Zum Kurs

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

Weitere Fragen oder Unterstützung bei der Einrichtung?

Dann helfe dir gerne weiter, einfach hier einen Beratungstermin buchen: https://calendly.com/antonio-blago/intromeeting

Sign up hier zu meinem Newsletter um Tipps, Tricks und Hacks rund um SEO, AI und Automatisierung nicht zu verpassen.

Wie sichtbar ist deine Marke in ChatGPT und Co.?

Der AI Check zeigt dir in wenigen Minuten, ob und wie KI-Assistenten deine Marke nennen.

AI Check starten