Tabulka slouží k systematické evidenci účetních dokladů a obsahuje řadu automatizovaných funkcí, které výrazně zjednodušují administrativní procesy. Systém umožňuje nastavit až 5 schvalovatelů, kteří mohou účetní doklady schvalovat k proplacení. Po zapsání nového dokladu se automaticky odešle email s upozorněním všem určeným osobám, že tabulka obsahuje doklady čekající na schválení. Jakmile projde doklad schvalovacím procesem, systém automaticky odešle určené osobě pokyn k provedení úhrady schválených dokladů. Tabulku je možné rozšířit o další pokročilé automatizace, například automatický zápis faktur přicházejících emailem nebo automatické zpracování dokumentů v listinné podobě, které se naskenují a umístí na určený sdílený disk, odkud se jejich údaje automaticky načtou do tabulky, což výrazně snižuje manuální práci a minimalizuje riziko chyb při zpracování účetních dokladů.
Upravený skript pro odesílání výzvy ke schválení dokladů– zapíše datum odeslání výzvy pouze u dokladů, které jsou již schváleny dostatečným počtem schvalovatelů
function sendNotificationAndUpdateDoklady() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ds = ss.getSheetByName('Dataset');
var j3 = ds.getRange('J3').getValue();
// Pokud J3 ≤ 0, ukončíme skript
if (j3 <= 0) return;
// Načteme e-maily z G1–G5 a odfiltrujeme prázdné
var emails = ds.getRange('G1:G5').getValues().flat().filter(function(addr) {
return addr.toString().trim() !== '';
});
if (emails.length > 0) {
// Předmět a tělo zprávy
var subject = ds.getRange('E10').getValue().toString();
var bodyLines = ds.getRange('E11:E14').getValues().flat();
// Sestavíme URL s odkazem přímo na list "Doklady"
var dokSheet = ss.getSheetByName('Doklady');
var gid = dokSheet.getSheetId();
var url = ss.getUrl() + '#gid=' + gid;
var body = bodyLines.join('\n') + '\n\nOdkaz na list Doklady: ' + url;
// Odeslání e-mailu
MailApp.sendEmail({
to: emails.join(','),
subject: subject,
body: body
});
}
// Aktualizace sloupce V na listu "Doklady"
var dok = ss.getSheetByName('Doklady');
var lastRow = dok.getLastRow();
if (lastRow < 2) return;
// Načteme data sloupce D a V (od řádku 2 dolů)
var dVals = dok.getRange(2, 4, lastRow - 1, 1).getValues();
var uVals = dok.getRange(2, 21, lastRow - 1, 1).getValues(); // sloupec U = 21
var vVals = dok.getRange(2, 22, lastRow - 1, 1).getValues();
// Prahová hodnota z Dataset!D3
var threshold = ds.getRange('D2').getValue();
var today = new Date();
for (var i = 0; i < dVals.length; i++) {
var hasDoklad = dVals[i][0].toString().trim() === '' ? false : true;
var notStamped = vVals[i][0].toString().trim() === '' ? true : false;
var isApproved = Number(uVals[i][0]) >= Number(threshold);
// Jen pokud všechny 3 podmínky platí
if (hasDoklad && notStamped && isApproved) {
vVals[i][0] = today;
}
}
dok.getRange(2, 22, vVals.length, 1).setValues(vVals);
}
Skript pro vyhledání konkrétního emailu s fakturou na podle názvu emailu a zápis do tabulky
function processInvoice() {
// 💡 Získání nebo vytvoření štítku pro označené zpracované e-maily
var processedLabel = GmailApp.getUserLabelByName("zpracovano");
if (!processedLabel) {
processedLabel = GmailApp.createLabel("zpracovano");
}
// 💡 Získání aktuálního data, roku a měsíce pro filtrování e-mailů
var now = new Date();
var currentYear = now.getFullYear();
var currentMonth = now.getMonth(); // Měsíce jsou 0–11
var firstDay = new Date(currentYear, currentMonth, 1);
var firstDayNextMonth = new Date(currentYear, currentMonth + 1, 1);
// 💡 Formátování data do řetězce pro GmailApp.search
var timeZone = Session.getScriptTimeZone();
var afterStr = Utilities.formatDate(firstDay, timeZone, "yyyy/MM/dd");
var beforeStr = Utilities.formatDate(firstDayNextMonth, timeZone, "yyyy/MM/dd");
// ✏️ **ZDE ZMĚŇTE** klíčová slova v dotazu dle své potřeby
var searchText = "EDERA - fakturujeme Vám za poskytované služby";
var query = 'after:' + afterStr + ' before:' + beforeStr + ' -label:zpracovano';
var threads = GmailApp.search(query);
// 💡 Filtrování vláken podle předmětu obsahujícího key text
var targetThreads = [];
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
if (messages[j].getSubject().indexOf(searchText) !== -1) {
targetThreads.push(threads[i]);
break;
}
}
}
if (targetThreads.length === 0) return; // 💡 Pokud není nic k zpracování, ukončíme
// 💡 Vybereme první odpovídající vlákno
var thread = targetThreads[0];
// 💡 Hledání PDF přílohy v e-mailech vlákna
var messages = thread.getMessages();
var pdfAttachment = null;
for (var i = 0; i < messages.length; i++) {
var attachments = messages[i].getAttachments();
for (var j = 0; j < attachments.length; j++) {
if (attachments[j].getContentType() === 'application/pdf') {
pdfAttachment = attachments[j];
break;
}
}
if (pdfAttachment) break;
}
if (!pdfAttachment) return; // 💡 Žádná PDF příloha -> konec
// ✏️ **ZMĚŇTE** ID složky na sdíleném disku, kam se mají faktury ukládat
var folderId = "1jR_yHt4u1POZlPj9_QX8HFbftJDUx-st";
var folder = DriveApp.getFolderById(folderId);
var savedFile = folder.createFile(pdfAttachment);
// 💡 Extrakce textu z PDF prostřednictvím vytvoření dočasného Google Docu
var blob = savedFile.getBlob();
var resource = { title: "tempDoc", mimeType: MimeType.GOOGLE_DOCS };
var tempDocFile = Drive.Files.insert(resource, blob);
var tempDocId = tempDocFile.id;
var doc = DocumentApp.openById(tempDocId);
var pdfText = doc.getBody().getText();
DriveApp.getFileById(tempDocId).setTrashed(true); // 💡 Smazání dočasného dokumentu
// 💡 Vyhledání částky k úhradě v textu faktury
var amountMatch = pdfText.match(/Částka k úhradě\s+([\d.,]+)/);
var totalAmount = amountMatch ? amountMatch[1] : "";
// ✏️ **ZMĚŇTE** ID tabulky a název listu podle svého účtu
var spreadsheetId = "1bknrmTw_lAOQ5Ihy_Akv8Ua4cfd_Nx8-LS50BVMZhajgmo";
var sheetName = "LIST1";
var ss = SpreadsheetApp.openById(spreadsheetId);
var sheet = ss.getSheetByName(sheetName);
// 💡 Najdeme první prázdný řádek ve sloupci D
var data = sheet.getRange("D:D").getValues();
var row = data.findIndex(function(r) { return !r[0]; }) + 1;
// 💡 Vytvoření hypertextového odkazu na uložený PDF soubor
var fileUrl = savedFile.getUrl();
var fileName = pdfAttachment.getName();
var hyperlinkFormula = '=HYPERLINK("' + fileUrl + '";"' + fileName + '")';
// 💡 Zápis hodnot do příslušných sloupců - UPRAVTE ČÍSLA SLOUPCŮ DLE POTŘEBY
sheet.getRange(row, 4).setValue(new Date()); // Sloupec D – aktuální datum
sheet.getRange(row, 5).setValue("EDERA Group a.s."); // Sloupec E – dodavatel
sheet.getRange(row, 6).setValue("faktura přijatá"); // Sloupec F – typ dokladu
sheet.getRange(row, 7).setValue("připojení k internetu U Divadla Pardubice"); // Sloupec G – popis
sheet.getRange(row, 9).setValue(totalAmount); // Sloupec I – částka
sheet.getRange(row, 11).setValue("režie"); // Sloupec K – kategorie
sheet.getRange(row, 12).setValue(hyperlinkFormula); // Sloupec L – odkaz
sheet.getRange(row, 13).setValue("DOSUD NEUHRAZENO"); // Sloupec M – stav
// 💡 Obarvení zapsaného řádku světle červeně
sheet.getRange(row, 1, 1, sheet.getLastColumn()).setBackground("#ffcccc");
// 💡 Označení vlákna jako zpracovaného
thread.addLabel(processedLabel);
// ✏️ **ZMĚŇTE** e-mailové adresy, předmět a text upozorňovacího e-mailu
var emailAddress = "INFO@CASSA.CZ,novak@cassa.cz";
var subject = "Faktura EDERA internet UDP49 (H&S) byla zapsána, uhraďte tuto fakturu!!!";
var body = "Toto je automatické oznámení, že faktura EDERA internet UDP49 (H&S) byla zapsána do tabulky a čeká na úhradu.\n" +
"Odkaz na tabulku: https://docs.google.com/spreadsheets/d/" + spreadsheetId + "/edit#gid=" + sheet.getSheetId();
MailApp.sendEmail(emailAddress, subject, body);
}