+180 XP

Gemini · Automatisierung mit Apps Script und Workspace

Mit Google Apps Script und der Gemini API wird Workspace von einem Ort, an dem Sie arbeiten, zu einem Ort, der für Sie arbeitet. Ein Script kann eingehende E-Mails nach Absicht automatisch labeln, Antworten entwerfen oder aus Rohdaten einen wöchentlichen Sheet-Report erstellen, ohne dass Sie etwas anfassen. Apps Script ist bereits in Gmail, Sheets, Drive und Calendar integriert und hat authentifizierten Zugriff auf Ihre Daten. Gemini liefert das Urteilsvermögen. Sie verbinden beides mit einem einzigen HTTP-Aufruf.

Diese Lektion behandelt die Verbindung, ein konkretes funktionierendes Beispiel und die Schutzmechanismen, auf die es ankommt, sobald das Script unbeaufsichtigt per Trigger läuft.

Warum Apps Script das richtige Bindeglied ist

Apps Script ist Googles serverlose JavaScript-Laufzeitumgebung, die in Workspace integriert ist. Sie müssen nichts bereitstellen. Ein Script kann Ihre Gmail-Threads lesen (GmailApp) und in eine Tabelle schreiben (SpreadsheetApp). Es kann außerdem über einen zeitbasierten Trigger laufen, vollständig mit den Berechtigungen Ihres Kontos.

Was es von Haus aus nicht kann, ist Schlussfolgern. Das übernimmt Gemini. Sie rufen die Gemini API innerhalb des Scripts mit `UrlFetchApp` auf, senden Text und erhalten strukturierten Output zurück.

Es gibt zwei Wege, den Aufruf zu authentifizieren:

  • Ein API-Key aus Google AI Studio ist der schnellste Einstieg. Er eignet sich gut für persönliche Automatisierungen und Prototypen.
  • Vertex AI mit einem Service Account ist die richtige Wahl, wenn die Automatisierung einer Organisation gehört oder IAM-Kontrollen, Data Residency oder VPC-Grenzen braucht. Siehe cloud.google.com/vertex-ai.

Für einen persönlichen Wochenreport reicht der API-Key. Das folgende Beispiel nutzt ihn und markiert, wo Sie umsteigen würden.

Das Beispiel: ein wöchentlicher Report zu Support-E-Mails

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

Das Beispiel ist zuverlässig, weil es structured output nutzt. Sie bitten Gemini, statt Fließtext JSON nach einem Schema zurückzugeben. Die Gemini API unterstützt ein responseSchema, das das Modell auf gültiges JSON beschränkt. Damit entfällt der fehleranfällige Schritt, einen Absatz des Modells zu parsen.

Der Klassifizierungsaufruf

Das ist der Kern: eine Funktion, die einen Batch aus Betreffzeilen und Textauszügen sendet und typisierte Klassifizierungen zurückbekommt.

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

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, auf die ein erfahrener Engineer achten würde:

  • Der Key liegt in den Script Properties, niemals im Quellcode. Legen Sie ihn einmal unter Project Settings fest oder führen Sie PropertiesService.getScriptProperties().setProperty('GEMINI_KEY', '...') aus.
  • gemini-flash-latest ist ein Alias, der auf das aktuelle Flash-Modell zeigt. Flash ist schnell und günstig, und Klassifizierung ist genau das, was es gut kann. Heben Sie sich Pro für lange Synthesen oder schwierige mehrstufige Urteile auf.
  • Der Alias schützt ein unbeaufsichtigtes Script vor der Abschaltung von Modellen. Google schaltet ältere Versionen nach einem veröffentlichten Zeitplan ab, und ein Script, das auf einen abgeschalteten Namen festgelegt ist, schlägt jeden Montag unbemerkt fehl. Der Nachteil: Das Verhalten kann sich ändern, wenn der Alias umgestellt wird. Wenn Sie reproduzierbaren Output brauchen, legen Sie eine bestimmte Version von der Modellseite fest und prüfen Sie alle paar Monate die Deprecation-Liste.
  • Mit muteHttpExceptions: true können Sie den Fehlertext lesen, statt eine generische Exception zu bekommen. Diesen Text wollen Sie in Ihren Logs haben.
  • Bündeln Sie die E-Mails in einem Aufruf. Eine Anfrage pro E-Mail verbraucht Quota und Zeit. Ein Prompt mit allen Auszügen der Vorwoche kostet deutlich weniger, und das Schema hält die Ergebnisse über index zugeordnet.

Anbindung an Gmail und Sheets

Die Orchestrierung um den Aufruf herum ist normales 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]);
}

Richten Sie dann einen Trigger ein, damit es unbeaufsichtigt läuft. Klicken Sie im Editor auf das Uhrsymbol (Triggers) oder erstellen Sie den Trigger einmalig im Code:

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

Führen Sie installTrigger einmal aus. Ab dann läuft `weeklyReport` jeden Montagmorgen, ohne dass ein Mensch beteiligt ist. Genau darum geht es, und genau hier beginnt auch das Risiko.

Schutzmechanismen für unbeaufsichtigte Ausführungen

Ein Script, das läuft, während Sie schlafen, Zugriff auf Ihr Gmail hat und ein externes Modell aufruft, braucht Disziplin. Die Fehlerarten unterscheiden sich vom interaktiven Prompting, weil niemand den Output beobachtet.

1. Begrenzen Sie den möglichen Schaden

Dieses Beispiel liest nur Gmail und hängt Zeilen an ein Sheet an. Es löscht, sendet oder ändert nie Threads. Halten Sie Automatisierungen standardmäßig bei Lesen und Anhängen. Sobald ein Script unbeaufsichtigt E-Mails senden oder Dateien löschen kann, wird ein schlechter Modell-Output oder ein Bug zu einer Aktion, die Sie nicht rückgängig machen können.

Wenn Sie zu automatischen Antworten oder Auto-Labeling übergehen, das E-Mails verschiebt, bauen Sie einen Dry-Run-Modus ein: Schreiben Sie die vorgeschlagenen Aktionen eine Woche lang in ein Sheet und prüfen Sie sie, bevor Sie das Script wirklich ausführen lassen.

2. Fordern Sie nur die Scopes an, die Sie brauchen

Apps Script leitet OAuth-Scopes aus den APIs ab, die Sie aufrufen. Legen Sie sie explizit im Manifest fest, damit eine neu hinzugekommene Funktion den Zugriff nicht unbemerkt 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"
  ]
}

Mit gmail.readonly kann selbst eine fehlerhafte Version keine E-Mails senden oder löschen. Diese eine Zeile ist Ihr stärkster Schutzmechanismus.

3. Verwenden Sie Modell-Output nie ungeprüft als Steuerlogik

Das Modell liefert Kategorien zurück. Bevor Sie sie als Objektschlüssel verwenden, prüfen Sie sie gegen dieselben Werte, die Ihr enum zulässt. Kommt ein unerwarteter Wert, loggen Sie ihn und überspringen Sie diesen Eintrag. Lassen Sie nicht den ganzen Lauf abstürzen und schreiben Sie keinen Datenmüll ins Sheet. Structured output macht das selten, und die zusätzliche Prüfung kostet fast nichts.

4. Gehen Sie mit Quota, Latenz und Teilausfällen um

UrlFetchApp-Aufrufe schlagen manchmal fehl, und Apps Script begrenzt die Ausführungszeit pro Lauf. Verpacken Sie den API-Aufruf in einen Retry mit Backoff für vorübergehende Fehler. Bauen Sie den Job so, dass ein Fehler am Montag nicht unbemerkt 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. Behalten Sie Kosten und Datenschutz im Blick

Flash ist günstig, aber bei einer außer Kontrolle geratenen Schleife oder einem Trigger, der versehentlich stündlich läuft, summieren sich die Kosten. Richten Sie für das Projekt einen Billing-Alert ein.

Sie senden außerdem E-Mail-Inhalte an eine API. Für den persönlichen Gebrauch ist der AI-Studio-Key akzeptabel. Für alles, was Kunden- oder Mitarbeiterdaten berührt, wechseln Sie zu Vertex AI. Dort bekommen Sie Datenverarbeitung auf Enterprise-Niveau, IAM und die Möglichkeit, Daten in einer Region zu halten. Für Deployments in Organisationen ist das Pflicht. Hier verläuft die Grenze zwischen einem Prototyp und etwas, das Compliance freigibt.

Build a Gmail automation with Apps Script and Gemini

Watch on YouTube

Wissenscheck

1. Was liefert laut der Lektion die Kombination aus Apps Script und der Gemini API im Kern, das keines von beiden allein vollständig bietet?

2. Warum empfiehlt die Lektion structured output (ein responseSchema), wenn Gemini aus dem Script aufgerufen wird?

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 „das richtige Bindeglied“ für diese Art von Automatisierung gilt.

Wählen Sie alle richtigen Antworten aus.

MEHRFACHAUSWAHL

5. Wählen Sie ALLE Aufgaben, die diese Automatisierung mit Apps Script und Gemini laut der Lektion für Sie erledigen kann.

Wählen Sie alle richtigen Antworten aus.

Wann Sie über Apps Script hinausgehen sollten

Apps Script passt zu Aufgaben, die innerhalb von Workspace stattfinden und eine klar abgegrenzte Aufgabe nach Zeitplan erledigen. Es ist das falsche Werkzeug, sobald Sie echtes mehrstufiges Agentenverhalten brauchen: Tools, die andere Tools aufrufen, Planung, Gedächtnis über mehrere Schritte oder eine Orchestrierung, die Sie wie echte Software testen und versionieren wollen.

Dann bietet das Gemini-Ökosystem passendere Optionen:

  • Agent Development Kit (ADK) ist ein Open-Source-Framework für Agenten mit Tools, Planung und Multi-Agent-Orchestrierung. Sie können es auf Ihrer eigenen Infrastruktur oder auf Vertex AI Agent Engine deployen. Nutzen Sie es, wenn die Logik über ein einzelnes Script hinauswächst.
  • Gemini CLI und Gemini Code Assist übernehmen Automatisierung auf Entwicklerseite in Terminal und IDE. Sie sind nicht für Dokument-Workflows in Workspace gebaut.
  • Gems sind wiederverwendbare, per Anweisung angepasste Assistenten in der Gemini-App. Nutzen Sie sie, wenn ein Mensch beteiligt ist und Sie überhaupt keinen Code brauchen.

Die Entscheidungsregel ist einfach. Lautet die Aufgabe „einige Workspace-Daten lesen, Gemini eine fokussierte Frage stellen, das Ergebnis nach Zeitplan zurück in Workspace schreiben“, gewinnt Apps Script durch Einfachheit. Muss ein Agent über viele Schritte entscheiden, welche Aktionen er ausführt, steigen Sie auf ADK auf Vertex AI um.

Ein Muster zum Übernehmen: den Report mit Kontext anreichern

Sie können die wöchentliche Zusammenfassung intelligenter machen, indem Gemini neben den Zahlen eine kurze Beschreibung der Trends entwirft. Fügen Sie einen zweiten Aufruf hinzu, der die Zahlen dieser Woche und die Zeile der Vorwoche übernimmt und eine Notiz in zwei Sätzen zu „was sich geändert hat“ anfordert, die ans Sheet angehängt wird. Halten Sie diesen Prompt eng gefasst und weiterhin an ein Schema gebunden (ein einzelnes `summary`-String-Feld), damit er in einem unbeaufsichtigten Lauf vorhersehbar bleibt. Das ist wenig zusätzliches Reasoning für einen großen Gewinn an Lesbarkeit, und auf Flash bleibt es günstig.

Key Takeaways

  • Apps Script ist das Bindeglied, Gemini liefert das Urteil. Lesen Sie Workspace-Daten mit den nativen Diensten, rufen Sie die Gemini API mit UrlFetchApp auf und schreiben Sie die Ergebnisse zurück, alles mit Ihrer eigenen Authentifizierung und einem zeitbasierten Trigger.
  • Nutzen Sie structured output (responseSchema) und bündeln Sie Ihre Anfragen. Beschränktes JSON macht fehleranfälliges Parsing überflüssig, und ein gebündelter Aufruf pro Lauf ist bei Kosten, Geschwindigkeit und Quota besser als ein Aufruf pro Eintrag.
  • Machen Sie Lesen und Anhängen zum Standard und legen Sie minimale OAuth-Scopes fest. gmail.readonly in appsscript.json ist eine stärkere Sicherheitsgarantie als jeder Code-Kommentar. Bauen Sie eine Dry-Run-Prüfung ein, bevor ein Script etwas sendet, verschiebt oder löscht.
  • Planen Sie für Fehler im unbeaufsichtigten Betrieb. Nutzen Sie Retries mit Backoff, Validierung gegen Ihre Enums, Billing-Alerts und geloggte Fehler, die Sie tatsächlich lesen können. Verwenden Sie einen Modell-Alias wie gemini-flash-latest oder verfolgen Sie die Deprecation-Termine, damit ein abgeschalteter Modellname Ihren Trigger nicht lahmlegt.
  • Steigen Sie bewusst um. Bleiben Sie für abgegrenzte, zeitgesteuerte Aufgaben bei Apps Script und wechseln Sie zu ADK auf Vertex AI, wenn Sie echte Agenten-Orchestrierung oder Datenkontrollen auf Enterprise-Niveau brauchen.

Häufige Fragen

Wie verbinden Sie Google Apps Script mit der Gemini API?

Sie rufen die Gemini API aus Apps Script mit einem einzigen HTTP-Request über `UrlFetchApp` auf, adressieren den generateContent-Endpoint und übergeben Ihren Key. Apps Script hat bereits authentifizierten Zugriff auf Gmail, Sheets, Drive und Calendar. Es liefert also die Daten, Gemini liefert die Bewertung. Speichern Sie den Key in den Script Properties und nicht in der Quelldatei.

Sollte ich für eine Workspace-Automatisierung einen AI Studio API-Key oder Vertex AI verwenden?

Ein API-Key aus Google AI Studio reicht für persönliche Automatisierungen und Prototypen und ist der schnellste Einstieg. Wechseln Sie zu Vertex AI mit einem Service Account, sobald die Automatisierung einer Organisation gehört oder Kunden- oder Mitarbeiterdaten berührt. Dort bekommen Sie IAM-Kontrollen, Datenverarbeitung auf Enterprise-Niveau und Data Residency. Dieser Wechsel markiert meist die Grenze zwischen einem Prototyp und etwas, das Compliance freigibt.

Wie bekomme ich von Gemini verlässlich JSON zurück statt eines Fließtexts?

Nutzen Sie Structured Output: Setzen Sie `responseMimeType` auf `application/json` und übergeben Sie ein `responseSchema` in `generationConfig`. Damit ist das Modell auf gültiges JSON festgelegt, das Ihrem Schema entspricht. Der fehleranfällige Schritt, Fließtext zu parsen, fällt weg. Verwenden Sie `enum`-Werte für Felder wie Kategorie oder Dringlichkeit, damit die Ausgabe innerhalb einer festen Menge bleibt.

Wie plane ich ein Apps Script so, dass es automatisch jede Woche läuft?

Legen Sie einen zeitbasierten Trigger an, entweder über das Uhr-Symbol im Apps-Script-Editor oder im Code mit `ScriptApp.newTrigger('weeklyReport').timeBased().onWeekDay(ScriptApp.WeekDay.MONDAY).atHour(7).create()`. Sie führen die Installationsfunktion einmal aus, danach läuft der Job von selbst, ohne dass ein Mensch eingreift. Achten Sie darauf, den Trigger nicht doppelt zu installieren. Duplikate bedeuten doppelte Läufe und doppelte API-Kosten.

Welche Absicherungen braucht ein unbeaufsichtigtes Apps Script, das Gemini nutzt?

Fünf Dinge: Beschränken Sie das Script auf Lesen und Anhängen, damit es nichts löschen oder versenden kann. Legen Sie minimale OAuth-Scopes in `appsscript.json` fest (`gmail.readonly` ist die wirksamste einzelne Schutzmaßnahme). Prüfen Sie die Modellausgabe gegen Ihr eigenes Enum, bevor Sie sie für die Ablaufsteuerung verwenden. Wiederholen Sie fehlgeschlagene `UrlFetchApp`-Aufrufe mit exponentiellem Backoff. Und richten Sie einen Billing-Alert ein. Wenn der Trigger um 7 Uhr morgens auslöst, schaut niemand auf die Ausgabe, also müssen Fehler im Code abgefangen werden. Bevor ein Script etwas versenden oder verschieben darf, lassen Sie es eine Woche im Dry-Run-Modus laufen und schreiben die vorgeschlagenen Aktionen zur Prüfung in ein Sheet.

Wann sollte ich von Apps Script zum Agent Development Kit wechseln?

Bleiben Sie bei Apps Script, solange die Aufgabe klar abgegrenzt ist: Workspace-Daten lesen, Gemini eine gezielte Frage stellen, das Ergebnis zurückschreiben, nach Zeitplan. Wechseln Sie zu ADK auf Vertex AI, wenn Sie echtes Agentenverhalten brauchen, also Tools, die andere Tools aufrufen, Planung, Gedächtnis über mehrere Schritte oder eine Orchestrierung, die Sie wie Software versionieren und testen wollen. ADK ist ein Open-Source-Framework, das Sie auf Ihrer eigenen Infrastruktur oder auf Vertex AI Agent Engine deployen können.