Das manuelle Erstellen personalisierter Serienbriefe oder Fortbildungsbestätigungen ist extrem zeitaufwendig. Mit Microsoft Word lassen sich Serienbriefe zwar generieren, doch die Anpassungsmöglichkeiten sind stark eingeschränkt. Besonders bei vielen Fortbildungsbestätigungen, die an Teilnehmer versendet werden müssen, sucht man nach effizienten Alternativen. Hier kommt Google Apps Script ins Spiel – eine leistungsstarke Lösung innerhalb der Google Workspace-Suite (Docs, Sheets, Drive), die nahezu unbegrenzte Anpassungen erlaubt. Mit diesem Ansatz können Sie Daten aus einer Google Tabelle lesen, Dokumente füllen, in PDFs konvertieren und per E-Mail versenden – alles automatisiert.
Der grobe Ablauf der Automatisierung
Der Prozess beginnt mit dem Auslesen der Fortbildungsdaten aus einer Google Tabelle. Zeile für Zeile werden diese Daten in ein Template-Dokument in Google Docs übertragen. Die resultierenden Dokumente werden als PDFs exportiert und automatisch mit einer personalisierten E-Mail an die Teilnehmer gesendet. Um den Überblick zu behalten, habe ich eine klare Ordnerstruktur in Google Drive eingerichtet: Ein Ordner für temporäre Docs (tempDocs) und einer für finale PDFs (finalPDFs). Das Skript referenziert genau diese IDs, was den Ablauf robust macht.
Diese Struktur sorgt für Ordnung und erleichtert das Löschen alter Dateien vor neuen Läufen. So vermeiden Sie Datei-Chaos in Ihrem Drive.
Ordnerstruktur in Google Drive für tempDocs und finalPDFs
Google Docs Template vorbereiten
Der Kernstück ist ein Google Docs-Template mit Platzhaltern in geschweiften Klammern, wie {vorname} oder {fortbildung-titel}. Diese Markierungen werden später durch die Skript-Daten ersetzt. Erstellen Sie ein solches Dokument einmalig und speichern Sie es in Ihrem Drive. Es dient als Basis für alle individuellen Bestätigungen, unabhängig von Fortbildungstitel, Datum oder Inhalten.
Dieser Ansatz spart enorm Zeit, da Sie kein neues Layout für jede Veranstaltung anpassen müssen.
Google Docs Template mit Platzhaltern wie {vorname} und {fortbildung-titel}
Google Tabelle mit Teilnehmerdaten aufsetzen
Die Datenquelle ist eine Google Tabelle mit Spalten wie Vorname, Nachname, E-Mail, Fortbildungsdatum, -zeit, -titel, -inhalte, Ausstellungsdatum und Versandstatus (z. B. ‘x’ für versendet). Die Header-Zeile definiert die Platzhalter-Schlüssel. Füllen Sie die Tabelle mit den Teilnehmerdaten – das Skript verarbeitet automatisch alle Zeilen.
Mit dieser Struktur individualisieren Sie Bestätigungen präzise und skalierbar für Dutzende oder Hunderte Teilnehmer.
Google Tabelle mit Spalten für Vorname, E-Mail, Fortbildungstitel und Versandstatus
Apps Script implementieren und konfigurieren
Apps Script ist die integrierte Skriptsprache von Google Workspace, mit der Sie Docs, Sheets und Drive erweitern können. Öffnen Sie in Ihrer Daten-Tabelle den Skript-Editor über Erweiterungen > Apps Script. Fügen Sie den folgenden Code ein und passen Sie die Folder-IDs (tempDocsFolder, finalPDFsFolder, templateFortbildungDoc) an Ihre Drive-Ordner an.
const tempDocsFolder = DriveApp.getFolderById('1b0Bbx67xh6YHnjHyAU6tpQSdvtH8GobO');
const finalPDFsFolder = DriveApp.getFolderById('1h3eJ-btrHsh1Qp4e2OXUFYMnMRFeKprK');
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Custom Fortbildungen')
.addItem('Erstelle & Sende Fortbildungen', 'getDataFromCurrentSheet')
.addToUi();
}
function getDataFromCurrentSheet() {
deleteFilesInFolder(tempDocsFolder);
deleteFilesInFolder(finalPDFsFolder);
const currentSheetRows = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
const jsonObject = getJsonArrayFromData(currentSheetRows);
jsonObject.forEach(function(row){
if(row['versandt'] != 'x'){
fillTemplateDocument(row);
}
});
}
function fillTemplateDocument(tempRow){
const templateFortbildungDoc = DriveApp.getFileById('1gu4uCXoroR632ZWAUlhUdPUxEKRmfwqWw_m_SMFcmms');
const newFortbildungDoc = templateFortbildungDoc.makeCopy(tempDocsFolder);
const formattetDate = tempRow['fortbildung-datum'].replace(/./g, '');
const formattetTitle = tempRow['fortbildung-titel'].replace(/s/g,'_');
newFortbildungDoc.setName(formattetDate + '_' + formattetTitle);
const openDoc = DocumentApp.openById(newFortbildungDoc.getId());
const body = openDoc.getBody();
body.replaceText('{vorname}', tempRow['vorname']);
body.replaceText('{nachname}', tempRow['nachname']);
body.replaceText('{fortbildung-datum}', tempRow['fortbildung-datum']);
body.replaceText('{fortbildung-zeit}', tempRow['fortbildung-zeit']);
body.replaceText('{fortbildung-titel}', tempRow['fortbildung-titel']);
body.replaceText('{fortbildung-inhalte}', tempRow['fortbildung-inhalte']);
body.replaceText('{datum-aus}', tempRow['datum-ausstellung']);
openDoc.saveAndClose();
const blobPDF = newFortbildungDoc.getAs("application/pdf");
const newPdfFile = finalPDFsFolder.createFile(blobPDF);
sendEmail(newPdfFile, tempRow);
}
function sendEmail(pdfFile, tempRow){
const template = HtmlService.createTemplateFromFile('email-template');
template.vorname = tempRow['vorname'];
template.nachname = tempRow['nachname'];
template.fortbildung = tempRow['fortbildung-titel'];
var message = template.evaluate().getContent();
MailApp.sendEmail({
to: tempRow['email'],
subject: "Fortbildungsbestätigung: " + tempRow['fortbildung-titel'],
htmlBody: message,
attachments: [pdfFile]
});
}
function deleteFilesInFolder(tempFolder){
const filesInFolder = tempFolder.getFiles();
while(filesInFolder.hasNext()){
filesInFolder.next().setTrashed(true);
}
}
function getJsonArrayFromData(data) {
var obj = {};
var result = [];
var headers = data[0];
var cols = headers.length;
var row = [];
for (var i = 1; i < data.length; i++){
row = data[i];
obj = {};
for (var col = 0; col < cols; col++){
obj[headers
] = row
;
}
result.push(obj);
}
return result;
}
Apps Script Editor öffnen in der Google Tabelle über Erweiterungen
Beim ersten Speichern und Ausführen autorisieren Sie das Skript. Die Funktion onOpen() erstellt ein Custom-Menü in der Tabelle. Klicken Sie auf Custom Fortbildungen > Erstelle & Sende Fortbildungen, um den Prozess zu starten. getDataFromCurrentSheet() löscht alte Dateien, liest Daten, konvertiert sie via getJsonArrayFromData() zu JSON und ruft fillTemplateDocument() für unversendete Zeilen (versandt != ‘x’) auf. Dort werden Platzhalter ersetzt, PDF erstellt und sendEmail() aufgerufen.
Custom Menü in Google Sheets mit „Erstelle & Sende Fortbildungen“ nach onOpen
E-Mail-Vorlage personalisieren
Erstellen Sie im Apps Script-Editor eine neue HTML-Datei namens email-template.html. Fügen Sie personalisierten HTML-Code ein, der Platzhalter wie <?= vorname ?> nutzt. Das Skript lädt und füllt diese Vorlage dynamisch.
HTML-Code der email-template.html im Apps Script Editor
Die gesendete E-Mail sieht professionell aus, inklusive Anhang und Signatur.
Beispiel für die personalisierte gesendete E-Mail mit PDF-Anhang
Das finale PDF-Dokument ist sauber formatiert und bereit zum Drucken oder Archivieren.
Beispiel für die ausgefüllte Fortbildungsbestätigung als PDF
Zusammenfassend ermöglicht Google Apps Script eine vollständige Automatisierung von Serienbriefen und Fortbildungsbestätigungen – effizient, skalierbar und kostenlos. Ideal für Lehrer, Schulverwaltungen oder jeden mit wiederkehrenden Massenversänden. Testen Sie es selbst und passen Sie den Code an Ihre Bedürfnisse an. Bei Fragen schreiben Sie an r.scheglmann@gmail.com.
Weiterführende Links
- Google Apps Script Dokumentation
- Unsere-Schule.org Codes
