Indexing Checker für Google Search Console

Antonio Blago
Antonio Blago
1 Leser 5,0/5 (5)

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.

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

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.

 
Cookie-Settings