More info
  • Home
  • >
  • Blog
  • >
  • SEO
  • >
  • Indexing Checker für Google Search Console

  Minuten Lesedauer verbleibend

April 18, 2025

Google Search Console, Tutorial
GSC Indexing Checker

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

Sie sehen gerade einen Platzhalterinhalt von Youtube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.

Mehr Informationen

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://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

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.

Wie hilfreich war dieser Beitrag?

Klicke auf die Sterne um zu bewerten!

Durchschnittliche Bewertung 5 / 5. Anzahl Bewertungen: 5

Bisher keine Bewertungen! Sei der Erste, der diesen Beitrag bewertet.

Profile Picture Antonio Blago
Antonio Blago

📈🧠 Hi, ich bin Antonio. Als ehemaliger Datenanalyst und Webentwickler optimiere ich #SEO datengetrieben. Mit Verkaufspsychologie und dem fundierten Neuro-SEO System® verstehe ich Nutzerverhalten und entwickle zielgerichtete Maßnahmen für deine Marketing Strategie. Folge mir gerne auf Instagram oder LinkedIn für tiefgehendes Know-how, smarte Tools und praxisnahe Tipps, die deine Online-Präsenz aufs nächste Level heben!

Über den Autor

📈🧠 Hi, ich bin Antonio. Als ehemaliger Datenanalyst und Webentwickler optimiere ich #SEO datengetrieben.
Mit Verkaufspsychologie und dem fundierten Neuro-SEO System® verstehe ich Nutzerverhalten und entwickle zielgerichtete Maßnahmen für deine Marketing Strategie. Folge mir gerne auf Instagram oder LinkedIn für tiefgehendes Know-how, smarte Tools und praxisnahe Tipps, die deine Online-Präsenz aufs nächste Level heben!

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}

Nutze meinen SEO Fahrplan, wie du bei Google auf Seite 1 kommst!

Trage dich dafür in meinem Newsletter ein und erhalte Zugriff für kostenlose Anleitungen, Checklisten und Tools.

>