Verbinden Sie Ihre App mit Google Drive, um Projekt- & Anwesenheitslisten per Klick automatisch in eine Google Tabelle zu speichern.
Öffnen Sie Ihr Google Drive und erstellen Sie eine neue Google Tabelle (z. B. mit dem Namen "Handwerker Zeit Exporte").
Klicken Sie in Ihrer Google Tabelle in der Menüleiste oben auf Erweiterungen $\rightarrow$ Apps Script. Löschen Sie dort den alten Code und fügen Sie folgenden Code ein:
function doPost(e) {
try {
var data = JSON.parse(e.postData.contents);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetName = "Export " + (data.monat || "Projektübersicht");
var sheet = ss.getSheetByName(sheetName);
if (!sheet) {
sheet = ss.insertSheet(sheetName);
}
sheet.clear();
var headers = ["Tag", "Datum"].concat(data.mitarbeiterNamen);
sheet.appendRow(headers);
var headerRange = sheet.getRange(1, 1, 1, headers.length);
headerRange.setBackground("#394F63");
headerRange.setFontColor("#FFFFFF");
headerRange.setFontWeight("bold");
headerRange.setHorizontalAlignment("center");
var tageKurz = ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."];
var dayColors = {
"Mo.": ["#f0fdf4", "#dcfce7"],
"Di.": ["#fef2f2", "#fee2e2"],
"Mi.": ["#fefce8", "#fef9c3"],
"Do.": ["#f0f9ff", "#e0f2fe"],
"Fr.": ["#fff7ed", "#ffedd5"],
"Sa.": ["#faf5ff", "#f3e8ff"],
"So.": ["#f8fafc", "#e2e8f0"]
};
var defaultColors = ["#ffffff", "#f1f5f9"];
var backgrounds = [];
data.zeilen.forEach(function(zeile) {
var wochentag = "";
if (zeile.datum && zeile.datum.indexOf(" - ") === -1) {
var parts = zeile.datum.split(".");
if (parts.length === 3) {
var d = new Date(parseInt(parts[2]), parseInt(parts[1]) - 1, parseInt(parts[0]));
wochentag = tageKurz[d.getDay()];
}
}
var rowArray = [wochentag, zeile.datum];
data.mitarbeiterUids.forEach(function(uid) {
var orte = zeile.einsatzorte[uid];
if (orte && orte.length > 0) {
rowArray.push(orte.join(", "));
} else {
rowArray.push("-");
}
});
sheet.appendRow(rowArray);
var colors = dayColors[wochentag] || defaultColors;
var rowBackgrounds = [];
for (var colIdx = 0; colIdx < headers.length; colIdx++) {
rowBackgrounds.push(colIdx % 2 === 0 ? colors[0] : colors[1]);
}
backgrounds.push(rowBackgrounds);
});
var totalCols = headers.length;
var totalRows = data.zeilen.length + 1;
var fullRange = sheet.getRange(1, 1, totalRows, totalCols);
if (backgrounds.length > 0) {
sheet.getRange(2, 1, backgrounds.length, totalCols).setBackgrounds(backgrounds);
}
fullRange.setBorder(true, true, true, true, true, true, "#cbd5e1", SpreadsheetApp.BorderStyle.SOLID);
fullRange.setWrap(true);
fullRange.setVerticalAlignment("middle");
sheet.setColumnWidth(1, 55);
sheet.setColumnWidth(2, 110);
for (var col = 3; col <= totalCols; col++) {
sheet.setColumnWidth(col, 170);
}
sheet.getRange(2, 1, totalRows - 1, 2).setHorizontalAlignment("center");
sortExportSheetsDescending(ss);
sheet.activate();
return ContentService.createTextOutput(JSON.stringify({ status: "success" }))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: error.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}
function sortExportSheetsDescending(ss) {
var sheets = ss.getSheets();
var exportSheets = [];
sheets.forEach(function(s) {
if (s.getName().indexOf("Export ") === 0) {
exportSheets.push(s);
}
});
exportSheets.sort(function(a, b) {
return b.getName().localeCompare(a.getName());
});
exportSheets.forEach(function(s, index) {
ss.setActiveSheet(s);
ss.moveActiveItem(index + 1);
});
}
1. Klicken Sie oben rechts auf den blauen Button Bereitstellen $\rightarrow$ Neue Bereitstellung.
2. Wählen Sie das Zahnrad-Symbol $\rightarrow$ Web-App.
3. Stellen Sie "Wer hat Zugriff" zwingend auf Jeder.
4. Klicken Sie auf Bereitstellen, gewähren Sie die Rechte und kopieren Sie die erzeugte Web-App-URL.