Automatisieren mit Apps Script und Workspace
# Automatisieren mit Apps Script und Workspace
Google Apps Script plus Gemini APIAPIApplication Programming Interface: a standardised interface that lets applications communicate and exchange data without knowing each other's internal workings.Vollständige Definition ansehen → 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 APIAPIApplication Programming Interface: a standardised interface that lets applications communicate and exchange data without knowing each other's internal workings.Vollständige Definition ansehen → 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 APIAPIApplication Programming Interface: a standardised interface that lets applications communicate and exchange data without knowing each other's internal workings.Vollständige Definition ansehen →-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 SchemaSchemaA schema is the formal blueprint that defines how data is structured, named, typed, and related within a database, file, or message.Vollständige Definition ansehen → zurückzugeben statt Prosa. Die Gemini APIAPIApplication Programming Interface: a standardised interface that lets applications communicate and exchange data without knowing each other's internal workings.Vollständige Definition ansehen → 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.
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-flashist 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: truelä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 SchemaSchemaA schema is the formal blueprint that defines how data is structured, named, typed, and related within a database, file, or message.Vollständige Definition ansehen → hält die Ergebnisse über
indexzugeordnet.
Die Verdrahtung mit Gmail und Sheets
Die Orchestrierung um den Call herum ist schlichtes Apps Script:
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:
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 PromptingPromptingPrompt engineering is the practice of designing and refining text inputs to guide large language models toward accurate, relevant, and reliable outputs.Vollständige Definition ansehen →, 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 kkThe average number of new users each existing user generates through referrals. Above 1.0, growth compounds on itself and becomes exponential.Vollständige Definition ansehen →ö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:
{
"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 SchemaSchemaA schema is the formal blueprint that defines how data is structured, named, typed, and related within a database, file, or message.Vollständige Definition ansehen → 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 APIAPIApplication Programming Interface: a standardised interface that lets applications communicate and exchange data without knowing each other's internal workings.Vollständige Definition ansehen →-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:
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 APIAPIApplication Programming Interface: a standardised interface that lets applications communicate and exchange data without knowing each other's internal workings.Vollständige Definition ansehen →. 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
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?
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.
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 ererThe ratio of interactions (likes, comments, shares) to reach for a given piece of content, used to gauge how well audiences respond relative to how many people saw it.Vollständige Definition ansehen → ausführt, steigen Sie auf ADK auf Vertex AI um.
Ein Muster, das sich lohnt zu klauen: den Report grounden
Sie kkThe average number of new users each existing user generates through referrals. Above 1.0, growth compounds on itself and becomes exponential.Vollständige Definition ansehen →ö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 ererThe ratio of interactions (likes, comments, shares) to reach for a given piece of content, used to gauge how well audiences respond relative to how many people saw it.Vollständige Definition ansehen → in einem unbeaufsichtigten Lauf vorhersagbar bleibt. Wenig Reasoning, großererThe ratio of interactions (likes, comments, shares) to reach for a given piece of content, used to gauge how well audiences respond relative to how many people saw it.Vollständige Definition ansehen → 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 APIAPIApplication Programming Interface: a standardised interface that lets applications communicate and exchange data without knowing each other's internal workings.Vollständige Definition ansehen → mit
UrlFetchAppaufrufen, 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.readonlyinappsscript.jsonist 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 kkThe average number of new users each existing user generates through referrals. Above 1.0, growth compounds on itself and becomes exponential.Vollständige Definition ansehen →ö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.