Co tento agent dělá

Hlídá Gmail každou hodinu
Rozpozná faktury v předmětu i těle emailu
Zachytí FA, FA/, FA12345, FA/2024/001
Přeskočí zálohové faktury a proformy
Stáhne PDF, JPG, PNG, TIFF přílohy
Uloží je do složky na Google Drive
Označí email štítkem Faktura-stažena
Nezduplikuje - každý email zpracuje jen jednou

Jaké emaily agent zachytí

KategorieHledaná slova / frázeVýsledek
Faktury CZ faktura, FA, FA/, FAxxxx, daňový doklad, vyúčtování služeb, faktura přijata ✓ stáhnout
Faktury EN/DE/SK invoice, rechnung, faktura, billing, bill ✓ stáhnout
Výjimka - zálohy zálohová faktura, záloha, proforma, advance invoice, anzahlung ✗ přeskočit
Formáty příloh .pdf, .jpg, .jpeg, .png, .tiff, .tif → uložit
Klíčová slova se hledají v předmětu emailu i v těle zprávy. Stačí, že dodavatel napíše "přikládám fakturu" v textu - agent ji zachytí.

Nastavení krok za krokem

KROK 1

Vytvořit složku na Google Drive

Přejdi na drive.google.com a vytvoř novou složku - například Faktury. Otevři ji a zkopíruj ID z URL - je to část za posledním lomítkem:

Příklad URL složky
https://drive.google.com/drive/folders/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs
                                                    toto je ID složky - zkopíruj ho
KROK 2

Otevřít Apps Script

  1. Přejdi na script.google.com
  2. Klikni na Nový projekt
  3. Přejmenuj projekt na FakturaAgent
  4. Smaž veškerý výchozí obsah souboru Code.gs
KROK 3

Vložit kód agenta

Zkopíruj celý kód níže a vlož ho do prázdného souboru Code.gs. Poté uprav řádek s ID složky.

Code.gs - Gmail Faktura Agent
// =============================================
// GMAIL FAKTURA AGENT
// Stahuje faktury z Gmailu na Google Drive
// Spousti se automaticky kazdou hodinu
// =============================================

// NASTAVENI - upravte podle sebe
const CONFIG = {
  // ID vasi slozky na Google Drive (viz Krok 1)
  driveFolderId: "VLOZIT_ID_SLOZKY_ZDE",

  // Nazev stitku v Gmailu (vytvori se automaticky)
  gmailLabel: "Faktura-stazena",

  // Klicova slova pro zachyceni faktury
  keywords: [
    "faktura", "invoice", "rechnung", "faktura",
    "daňový doklad", "vyúčtování služeb",
    "faktura přijata", "billing", "bill"
  ],

  // Regex pro FA, FA/, FA12345, FA/2024/001 atd.
  faPattern: /FA[\/\-]?[\d]{0,10}/i,

  // Vyjimky - tyto emaily se ✗ přeskočit
  excludeKeywords: [
    "zálohová faktura", "záloha", "proforma",
    "advance invoice", "anzahlung", "deposit"
  ],

  // Povolene pripony souboru
  allowedExtensions: [".pdf", ".jpg", ".jpeg", ".png", ".tiff", ".tif"]
};

function zpracujFaktury() {
  const label = getOrCreateLabel(CONFIG.gmailLabel);
  const folder = DriveApp.getFolderById(CONFIG.driveFolderId);
  const existingFiles = getExistingFileNames(folder);

  const keywordQuery = CONFIG.keywords
    .map(k => `"${k}"`).join(" OR ");
  const query = `has:attachment (${keywordQuery}) -label:${CONFIG.gmailLabel}`;
  const threads = GmailApp.search(query, 0, 50);
  let count = 0;

  for (const thread of threads) {
    for (const msg of thread.getMessages()) {
      const combined = `${msg.getSubject()} ${msg.getPlainBody()}`;
      const low = combined.toLowerCase();

      if (CONFIG.excludeKeywords.some(k => low.includes(k))) continue;
      const ok = CONFIG.keywords.some(k => low.includes(k)) || CONFIG.faPattern.test(combined);
      if (!ok) continue;

      for (const att of msg.getAttachments()) {
        const name = att.getName().toLowerCase();
        if (!CONFIG.allowedExtensions.some(e => name.endsWith(e))) continue;
        const date = Utilities.formatDate(msg.getDate(), "Europe/Prague", "yyyy-MM-dd");
        const fileName = `${date}_${att.getName().replace(/[^a-zA-Z0-9.\-_]/g,"_")}`;
        if (existingFiles.has(fileName)) continue;
        folder.createFile(att.copyBlob().setName(fileName));
        existingFiles.add(fileName);
        count++;
      }
    }
    thread.addLabel(label);
  }
  Logger.log(`Hotovo. Ulozeno souboru: ${count}`);
}

function getOrCreateLabel(name) {
  let l = GmailApp.getUserLabelByName(name);
  if (!l) l = GmailApp.createLabel(name);
  return l;
}

function getExistingFileNames(folder) {
  const s = new Set();
  const f = folder.getFiles();
  while (f.hasNext()) s.add(f.next().getName());
  return s;
}
KROK 4

Doplnit ID složky

Na začátku kódu najdi tento řádek a vlož ID své složky z Kroku 1:

Změň tento řádek
driveFolderId: "VLOZIT_ID_SLOZKY_ZDE",

// Po změně vypadá takto:
driveFolderId: "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs",
KROK 5

Otestovat ručně

  1. Klikni na tlačítko Spustit nahoře v Apps Script
  2. Při prvním spuštění tě Google požádá o oprávnění - klikni Povolit
  3. Zkontroluj Protokoly (Zobrazit - Protokoly) - měl by tam být: Hotovo. Ulozeno souboru: X
  4. Zkontroluj složku na Drive - soubory by měly být tam
Google označí script jako neověřenou aplikaci - to je u vlastních scriptů normální. Klikni Pokračovat a potvrď oprávnění.
KROK 6

Nastavit automatické spouštění každou hodinu

  1. Klikni vlevo na ikonu hodin Triggery
  2. Klikni Přidat trigger (vpravo dole)
  3. Nastav: Funkce - zpracujFaktury, Zdroj - Časový spínač, Interval - Každou hodinu
  4. Klikni Uložit
Od teď agent běží každou hodinu sám. Každý zpracovaný email dostane štítek Faktura-stažena - takže vždy víš co už bylo uloženo.

Doporučení pro lepší výsledky

Jak funguje rozpoznávání FA formátů

Kód používá regulární výraz který zachytí všechny běžné varianty: FA, FA/, FA2024001, FA/2024/001, FA-001. Funguje v předmětu i v těle zprávy.

Kde najít chyby a logy

Apps Script ukládá záznamy každého spuštění. Najdeš je pod Triggery - Historie spuštění. Pokud agent nic nestáhne nebo spadne, uvidíš tam přesně proč.

Třídit do podsložek (volitelné)

Pokud budete časem chtít faktury třídit podle roku nebo měsíce, jde to přidat na cca 10 řádků kódu. Základ funguje i bez toho.

Nechcete si s tím lámat hlavu?

Přijde vám to složité?
Nebo technické věci prostě nenávidíte?

Za 199 Kč vám to nastavím během 30 minut online. Vy jen sledujete, já klikám. Na konci máte fungujícího agenta bez jediného řádku kódu.

Jak to probíhá
Online přes TeamViewer. Stáhnete jednorázový QuickSupport, já se připojím. 30 minut, hotovo.
Platba
Převodem na účet po objednávce. Číslo účtu a termín dostanete emailem do 24 hodin.
Nastavit za 199 Kč, rezervovat termín Rezervovat 30 min konzultaci zdarma

Gabriela Tomíčková - IČO: 75905311 - tomickova.info@gmail.com

Potřebuješ pomoct?

Nevíš si rady? Klidně se ozvi.

Máte ve firmě podobný ruční proces? Napište mi, podíváme se, jestli se dá zjednodušit.

Gabriela Tomíčková
AI a Procesní konzultant