+180 XP

Automatisieren mit Apps Script und Workspace

# Automatisieren mit Apps Script und Workspace

Google Apps Script plus Gemini API kann Workspace von einem Ort, an dem Sie arbeiten, in einen Ort verwandeln, der für Sie arbeitet: eingehende E-Mails automatisch nach Absicht labeln, Antworten entwerfen oder einen wöchentlichen Sheet-Report aus Rohzeilen erstellen, ohne dass Sie etwas anfassen. Der Schlüssel: Apps Script sitzt bereits in Gmail, Sheets, Drive und Calendar und hat authentifizierten Zugriff auf Ihre Daten, und Gemini liefert das Urteilsvermögen. Verbunden wird beides mit einem einzigen HTTP-Call.

Diese Lektion zeigt die Verkabelung, ein konkretes funktionierendes Beispiel und die Guardrails, die zählen, sobald das Skript unbeaufsichtigt per Trigger läuft.

Warum Apps Script der richtige Klebstoff ist

Apps Script ist Googles serverlose JavaScript-Runtime, eingebaut in Workspace. Sie provisionieren nichts. Ein Skript kann Ihre Gmail-Threads lesen (GmailApp), in eine Tabelle schreiben (SpreadsheetApp) und auf einem zeitbasierten Trigger laufen, alles mit den Berechtigungen Ihres Accounts.

Was es nativ nicht hat, ist Reasoning. Das ist der Gemini-Teil. Sie rufen die Gemini API aus dem Skript heraus mit UrlFetchApp auf, schicken Text hin und bekommen strukturierten Output zurück.

Zwei Wege, den Call zu authentifizieren:

  • API-Key aus [Google AI Studio](https://aistudio.google.com): der schnellste Start. Gut für persönliche Automationen und Prototypen.
  • Vertex AI mit einem Service Account: die richtige Wahl, wenn die Automation einer Organisation gehört und IAM-Kontrollen, Data Residency oder VPC-Grenzen braucht. Siehe cloud.google.com/vertex-ai.

Für einen persönlichen Wochenreport ist der API-Key-Weg in Ordnung. Wir nutzen ihn und markieren, wo Sie wechseln würden.

Das Beispiel: ein wöchentlicher Support-E-Mail-Report

Das Ziel: jeden Montag um 7 Uhr die E-Mails der letzten Woche mit dem Label support scannen, Gemini jede nach Kategorie und Dringlichkeit klassifizieren lassen und eine saubere Zusammenfassungszeile an ein Tracking-Sheet anhängen.

Der Trick, der das zuverlässig macht, ist strukturierter Output: Sie bitten Gemini, JSON nach einem Schema zurückzugeben statt Prosa. Die Gemini API unterstützt ein responseSchema, sodass das Modell auf valides JSON beschränkt ist. Damit fällt der fragile Schritt „Absatz des Modells parsen" weg.

Der Klassifikations-Call

Hier der Kern: eine Funktion, die einen Batch von E-Mail-Subjects und Snippets schickt und typisierte Klassifikationen zurückbekommt.

javascript
const GEMINI_KEY = PropertiesService.getScriptProperties().getProperty('GEMINI_KEY');
const MODEL = 'gemini-2.5-flash';

function classifyEmails(emails) {
  const url = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent?key=${GEMINI_KEY}`;
  const prompt = 'Classify each support email. Categories: billing, bug, feature_request, other. ' +
    'Urgency: low, medium, high.\n\n' +
    emails.map((e, i) => `[${i}] Subject: ${e.subject}\nSnippet: ${e.snippet}`).join('\n\n');

  const payload = {
    contents: [{ parts: [{ text: prompt }] }],
    generationConfig: {
      responseMimeType: 'application/json',
      responseSchema: {
        type: 'array',
        items: {
          type: 'object',
          properties: {
            index: { type: 'integer' },
            category: { type: 'string', enum: ['billing', 'bug', 'feature_request', 'other'] },
            urgency: { type: 'string', enum: ['low', 'medium', 'high'] }
          },
          required: ['index', 'category', 'urgency']
        }
      }
    }
  };

  const res = UrlFetchApp.fetch(url, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  });

  if (res.getResponseCode() !== 200) {
    throw new Error(`Gemini API ${res.getResponseCode()}: ${res.getContentText()}`);
  }
  const body = JSON.parse(res.getContentText());
  return JSON.parse(body.candidates[0].content.parts[0].text);
}

Punkte, die einen Senior Engineer interessieren:

  • Der Key liegt in den Script Properties, nie im Quellcode. Setzen Sie ihn einmal unter Projekteinstellungen oder mit PropertiesService.getScriptProperties().setProperty('GEMINI_KEY', '...').
  • gemini-2.5-flash ist hier die richtige Stufe. Flash ist schnell und günstig, und Klassifikation ist genau sein Sweet Spot. Pro bleibt Aufgaben vorbehalten, die tieferes Reasoning brauchen (lange Synthesen, schwierige mehrstufige Urteile). Prüfen Sie aktuelle Modellnamen auf ai.google.dev, bevor Sie deployen, denn die Stufen entwickeln sich weiter.
  • muteHttpExceptions: true lässt Sie den Error-Body lesen statt einen generischen Throw zu bekommen. Diesen Text wollen Sie in Ihren Logs haben.
  • Batchen Sie die E-Mails in einen Call. Ein Request pro E-Mail verbrennt Quota und Zeit. Ein Prompt mit allen Snippets der letzten Woche ist deutlich günstiger, und das Schema hält die Ergebnisse über index zugeordnet.

Die Verdrahtung mit Gmail und Sheets

Die Orchestrierung um den Call herum ist schlichtes Apps Script:

javascript
function weeklyReport() {
  const since = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
  const query = `label:support after:${Utilities.formatDate(since, 'GMT', 'yyyy/MM/dd')}`;
  const threads = GmailApp.search(query, 0, 50);

  const emails = threads.map(t => {
    const msg = t.getMessages()[0];
    return { subject: msg.getSubject(), snippet: msg.getPlainBody().slice(0, 400) };
  });
  if (emails.length === 0) return;

  const results = classifyEmails(emails);

  const sheet = SpreadsheetApp.openById('YOUR_SHEET_ID').getSheetByName('Weekly');
  const counts = { billing: 0, bug: 0, feature_request: 0, other: 0, high: 0 };
  results.forEach(r => {
    counts[r.category]++;
    if (r.urgency === 'high') counts.high++;
  });
  sheet.appendRow([new Date(), emails.length, counts.billing, counts.bug,
    counts.feature_request, counts.other, counts.high]);
}

Dann setzen Sie einen Trigger, damit es unbeaufsichtigt läuft: im Editor auf das Uhr-Symbol (Triggers) klicken, oder einmal per Code:

javascript
function installTrigger() {
  ScriptApp.newTrigger('weeklyReport')
    .timeBased().onWeekDay(ScriptApp.WeekDay.MONDAY).atHour(7).create();
}

Führen Sie installTrigger einmal aus. Von da an feuert weeklyReport jeden Montagmorgen ohne Menschen in der Schleife. Das ist der ganze Sinn, und genau dort beginnt auch das Risiko.

Guardrails für unbeaufsichtigte Läufe

Ein Skript, das läuft, während Sie schlafen, Ihren Gmail-Scope hält und ein externes Modell aufruft, braucht Disziplin. Die Failure Modes sind andere als beim interaktiven Prompting, weil niemand auf den Output schaut.

1. Blast Radius begrenzen

Dieses Beispiel liest nur Gmail und hängt an ein Sheet an. Es löscht nie, sendet nie, verändert keine Threads. Halten Sie Automationen standardmäßig auf read-and-append. Sobald ein Skript unbeaufsichtigt E-Mails senden oder Dateien löschen kann, wird ein schlechter Modell-Output oder ein Bug zu einer Aktion, die Sie nicht zurücknehmen können.

Wenn Sie doch zu Auto-Antworten oder Auto-Labeling weitergehen, das Mail verschiebt, bauen Sie einen Dry-Run-Modus ein: schreiben Sie die vorgeschlagene Aktion eine Woche lang in ein Sheet und prüfen Sie sie, bevor Sie das Skript wirklich ausführen lassen.

2. Nur die Scopes anfordern, die Sie brauchen

Apps Script leitet OAuth-Scopes aus den APIs ab, die Sie aufrufen, aber Sie sollten sie im Manifest explizit festnageln, damit eine versehentlich neue Funktion den Zugriff nicht stillschweigend erweitern kann. In appsscript.json:

json
{
  "oauthScopes": [
    "https://www.googleapis.com/auth/gmail.readonly",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/script.external_request"
  ]
}

gmail.readonly bedeutet, dass selbst eine fehlerhafte Version buchstäblich nicht senden oder löschen kann. Diese eine Zeile ist Ihr stärkster Guardrail.

3. Modell-Output niemals als Control Flow vertrauen

Das Modell gibt Kategorien zurück. Validieren Sie sie gegen Ihr enum, bevor Sie sie als Objekt-Keys verwenden, genau wie das Schema es erzwingt. Kommt ein Wert an, den Sie nicht erwartet haben, loggen und überspringen, statt den ganzen Lauf abzubrechen oder Müll zu schreiben. Strukturierter Output macht das selten, aber Defense in Depth ist billig.

4. Quota, Latenz und Teilausfälle behandeln

UrlFetchApp-Calls scheitern manchmal. Apps Script hat außerdem Limits für die Ausführungszeit pro Lauf. Packen Sie den API-Call in ein Retry mit Backoff für transiente Fehler und designen Sie den Job so, dass ein Fehler am Montag nicht stillschweigend die Montagsdaten verliert:

javascript
function fetchWithRetry(url, options, tries = 3) {
  for (let i = 0; i < tries; i++) {
    const res = UrlFetchApp.fetch(url, options);
    if (res.getResponseCode() < 500) return res;
    Utilities.sleep(1000 * Math.pow(2, i));
  }
  throw new Error('Gemini API failed after retries');
}

5. Kosten und Datenschutz im Blick behalten

Flash ist günstig, aber eine entlaufene Schleife oder ein Trigger, der versehentlich stündlich läuft, summiert sich. Setzen Sie einen Billing Alert auf das Projekt. Zum Datenschutz: Sie senden E-Mail-Inhalte an eine API. Für den persönlichen Gebrauch ist der AI-Studio-Key akzeptabel, aber für alles, was Kunden- oder Mitarbeiterdaten berührt, wechseln Sie zu Vertex AI, wo Sie Enterprise Data Handling, IAM und die Möglichkeit bekommen, Daten in einer Region zu halten. Für organisationsweite Deployments ist das kein Nice-to-have, es ist die Grenze zwischen einem Prototyp und etwas, das Compliance genehmigen wird.

Build a Gmail automation with Apps Script and Gemini

Watch on YouTube

Wissenscheck

1. Was liefert laut Lektion die Kombination aus Apps Script und Gemini API grundlegend, was keines von beiden allein vollständig hat?

2. Warum empfiehlt die Lektion strukturierten Output (ein responseSchema) beim Aufruf von Gemini aus dem Skript?

3. In welchem Szenario würden Sie Vertex AI mit einem Service Account einem API-Key aus Google AI Studio vorziehen?

MEHRFACHAUSWAHL

4. Wählen Sie ALLE Aussagen, die korrekt beschreiben, warum Apps Script als „der richtige Klebstoff" für diese Art von Automation bezeichnet wird.

Wählen Sie alle richtigen Antworten aus.

MEHRFACHAUSWAHL

5. Wählen Sie ALLE Aufgaben, die die Lektion als Dinge darstellt, die diese Automation aus Apps Script + Gemini für Sie tun kann.

Wählen Sie alle richtigen Antworten aus.

Wann Sie über Apps Script hinausgreifen sollten

Apps Script ist perfekt für „das lebt in Workspace und erledigt zeitgesteuert eine abgegrenzte Aufgabe". Es ist das falsche Werkzeug, sobald Sie echtes mehrstufiges Agent-Verhalten brauchen: Tools, die andere Tools aufrufen, Planning, Memory über Schritte hinweg oder Orchestrierung, die Sie wie echte Software testen und versionieren wollen.

An diesem Punkt gibt Ihnen das Gemini-Ökosystem passendere Optionen:

  • [Agent Development Kit (ADK)](https://google.github.io/adk-docs/): ein Open-Source-Framework für den Bau von Agents mit Tools, Planning und Multi-Agent-Orchestrierung, deploybar auf Ihrer eigenen Infrastruktur oder auf Vertex AI Agent Engine. Nutzen Sie es, wenn die Logik einem einzelnen Skript entwächst.
  • Gemini CLI und Gemini Code Assist: für Automatisierung auf Entwicklerseite im Terminal und in der IDE, nicht für Workspace-Dokument-Workflows.
  • Gems: für wiederverwendbare, per Instruktion getunte Assistenten in der Gemini-App, wenn ein Mensch in der Schleife ist und Sie überhaupt keinen Code brauchen.

Die Entscheidungsregel: Wenn die Aufgabe lautet „ein paar Workspace-Daten lesen, Gemini eine fokussierte Frage stellen, das Ergebnis irgendwo in Workspace schreiben, zeitgesteuert", gewinnt Apps Script bei der Einfachheit. Wenn es darum geht, dass ein Agent über viele Schritte entscheidet, welche Aktionen er ausführt, steigen Sie auf ADK auf Vertex AI um.

Ein Muster, das sich lohnt zu klauen: den Report grounden

Sie können die Wochenzusammenfassung smarter machen, indem Gemini eine kurze Erzählung der Trends entwirft, nicht nur Zählungen. Fügen Sie einen zweiten Call hinzu, der die Zählungen der Woche plus die Zeile der Vorwoche nimmt und um eine Zwei-Satz-Notiz „was sich geändert hat" bittet, die ans Sheet angehängt wird. Halten Sie diesen Prompt eng gefasst und weiter schemagebunden (ein einzelnes summary-Stringfeld), damit er in einem unbeaufsichtigten Lauf vorhersagbar bleibt. Wenig Reasoning, großer Gewinn an Lesbarkeit, auf Flash weiterhin günstig.

Zentrale Erkenntnisse

  • Apps Script ist der Klebstoff, Gemini das Urteilsvermögen. Workspace-Daten mit nativen Services lesen, die Gemini API mit UrlFetchApp aufrufen, Ergebnisse zurückschreiben, alles unter Ihrer eigenen Auth und einem zeitbasierten Trigger.
  • Nutzen Sie strukturierten Output (`responseSchema`) und batchen Sie Ihre Requests. Beschränktes JSON beseitigt fragiles Parsing, und ein gebatchter Call pro Lauf schlägt einen Call pro Element bei Kosten, Geschwindigkeit und Quota.
  • Machen Sie read-and-append zum Standard und nageln Sie minimale OAuth-Scopes fest. gmail.readonly in appsscript.json ist eine stärkere Sicherheitsgarantie als jeder Code-Kommentar. Bauen Sie ein Dry-Run-Review ein, bevor ein Skript sendet, verschiebt oder löscht.
  • Konstruieren Sie für unbeaufsichtigtes Scheitern: Retries mit Backoff, Validierung gegen Ihre Enums, Billing Alerts und geloggte Fehler, die Sie tatsächlich lesen können.
  • Steigen Sie bewusst auf. Bleiben Sie bei Apps Script für abgegrenzte zeitgesteuerte Aufgaben; wechseln Sie zu ADK auf Vertex AI, wenn Sie echte Agent-Orchestrierung oder Enterprise-Datenkontrollen brauchen.