Google Apps Script (GAS) je cloudová skriptovací platforma založená na JavaScriptu, která umožňuje automatizovat, rozšiřovat a přizpůsobovat aplikace Google Workspace. Tento mocný nástroj vám umožní vytvářet vlastní řešení přímo v prostředí Google bez nutnosti instalace softwaru na váš počítač.
GAS původně vznikl jako „makra“ pro Google Sheets, ale postupně se vyvinul v komplexní vývojovou platformu. Jeho největší výhodou je přímá integrace se všemi Google službami (Dokumenty, Tabulky, Gmail, Kalendář, Formuláře…) a možnost vytvářet automatizace, které výrazně zefektivní vaši práci.
Obsah článku
Pro koho je tento průvodce
Tento průvodce je určen jak pro začátečníky bez programátorských znalostí, kteří chtějí automatizovat své pracovní postupy, tak pro pokročilejší uživatele, kteří hledají nejlepší postupy pro efektivní vývoj v GAS. Provedeme vás celým procesem od základního pochopení platformy až po pokročilé techniky a koncepty.
I. Základy Google Apps Script
Vytvoření prvního projektu
Existují dva základní způsoby, jak vytvořit nový projekt:
- Projekt vázaný na dokument (container-bound)
- Otevřete Google dokument, tabulku nebo prezentaci
- Klikněte na „Rozšíření > Apps Script“
- V Google Formulářích klikněte na „Další > Editor skriptu“
- Samostatný projekt (standalone)
- Navštivte stránku
script.google.com
a klikněte na „Nový projekt“ - Alternativně v Google Disku klikněte na „Nový > Další > Google Apps Script“
- Navštivte stránku
Samostatný skript je výhodný, pokud chcete pracovat s více dokumenty najednou – když potřebujete jeden skript pro práci s několika tabulkami, dokumenty nebo formuláři, Vytváříte webovou aplikaci – pokud vyvíjíte aplikaci, která bude přístupná přes URL, potřebujete centrální správu, třeba když chcete mít jeden centrální skript, který budete aktualizovat a změny se projeví všude, děláte obecnou službu nebo nástroj – vyvíjíte funkcionalitu, která není úzce svázána s konkrétním dokumentem a nakonec jestliže chcete sdílet kód mezi projekty (když potřebujete stejný kód použít ve více projektech).
Nejčistější a nejudržitelnější metodou sdílení samostatného kódu je vytvoření knihovny. Tento přístup umožňuje centralizovat kód a používat ho napříč mnoha projekty:
- V samostatném skriptu klikněte na „Projekt > Nastavení“ a zkopírujte ID skriptu
- Přejděte na „Publikovat > Nasadit jako knihovnu“
- V cílovém dokumentovém skriptu přidejte knihovnu přes sekci „Knihovny“
Hlavní výhodou knihoven je centrální správa kódu – když změníte kód v knihovně a publikujete novou verzi, můžete tuto aktualizaci zpřístupnit všem projektům, které ji využívají. Kromě toho knihovny podporují verzování, což umožňuje kontrolovat, kdy a jak se aktualizace propagují do závislých projektů.
Samostatné skripty lze nasadit jako webové aplikace s vlastním URL, což vytváří komunikační bod pro dokumentové skripty:
- Implementujte funkce doGet() nebo doPost() v samostatném skriptu
- Nasaďte skript jako webovou aplikaci s příslušnými nastaveními přístupu
- Z dokumentových skriptů volejte webovou aplikaci pomocí UrlFetchApp
Tento přístup je výhodný, když potřebujete centralizovanou službu s jednotným přístupovým bodem, ke které mohou přistupovat různé skripty nebo dokonce externí systémy.
Nejpřímočařejším způsobem propojení je přímý přístup k dokumentům pomocí jejich ID. Tento přístup je vhodný, když potřebujete z jednoho centrálního skriptu pracovat s mnoha různými dokumenty. Jediným požadavkem je, aby uživatel spouštějící skript měl přístupová práva ke všem odkazovaným dokumentům.
Váš první skript
Pojďme vytvořit jednoduchý „Hello World“ skript:
function myFunction() {
Browser.msgBox("Hello World!");
}
Po napsání funkce klikněte na tlačítko Spustit (ikona přehrávání). Při prvním spuštění budete vyzváni k udělení oprávnění. Poté se zobrazí dialogové okno s textem „Hello World!“.
Autorizace a oprávnění
Při prvním spuštění skriptu vás Google provede procesem autorizace. Toto je důležitý bezpečnostní prvek, protože skripty mohou přistupovat k vašim datům. U vlastních skriptů se zobrazí varování o „neověřené aplikaci“, což je normální – jednoduše pokračujte procesem.
Oprávnění fungují tak, že:
- Spouštíte-li skript manuálně (kliknutím na tlačítko nebo položku menu), poběží pod vaším účtem
- U automaticky spouštěných skriptů je situace složitější a závisí na typu triggeru (spouštěče)
II. Analýza a definice účelu skriptu
Než začnete psát kód, je klíčové jasně definovat, co má váš skript dělat. Čím konkrétnější budete, tím snazší bude implementace.
Definice problému a cíle
Místo obecného „chci automatizovat tabulku“ si stanovte konkrétní cíl, například:
- „Potřebuji každý pondělí v 8:00 poslat e-mailem souhrnná data z tabulky všem manažerům“
- „Když přijde nová odpověď z formuláře, chci automaticky vygenerovat personalizovaný dokument“
- „Potřebuji každý den kontrolovat sloupec s datem splatnosti faktur a posílat upomínky“
Případ použití: Uvažujte v krocích
Pro efektivní návrh skriptu si rozdělte problém na jednotlivé kroky:
- Identifikujte zdroj dat – odkud skript bere informace?
- Definujte proces – jakou transformaci nebo akci skript provádí?
- Určete výstup – jaký je očekávaný výsledek (e-mail, nový dokument, aktualizace dat)?
- Stanovte podmínky spuštění – co a kdy skript aktivuje?
III. Přesný popis vstupních dat a struktury zdrojových souborů
Pro správné fungování skriptu musíte přesně znát strukturu dat, se kterými budete pracovat.
Struktura dat
Popište si detailně, jak vypadá váš zdroj dat:
- U tabulky: které listy, sloupce a řádky obsahují potřebná data
- U formuláře: názvy polí a typy odpovědí
- U dokumentů: strukturu obsahu a případně formátování
Příklad: „Data jsou v Google tabulce ‚Prodeje 2023‘, list ‚Únor‘. Sloupec A obsahuje datum objednávky, sloupec B jméno zákazníka, sloupec C e-mail a sloupec D částku. První řádek obsahuje záhlaví, data začínají od druhého řádku.“
Formát dat
Ujasněte si, jaký formát mají vaše data:
- Datumy (DD/MM/YYYY nebo MM/DD/YYYY?)
- Čísla (s desetinnou čárkou nebo tečkou?)
- Text (včetně specifických formátů jako jsou e-maily, telefonní čísla)
IV. Spouštěče (Triggers) v Google Apps Script
Spouštěče (triggery) určují, kdy se má skript spustit. Je to klíčový prvek automatizace, protože definuje, kdy váš digitální asistent začne pracovat.
Typy spouštěčů
V GAS existují dva hlavní typy spouštěčů:
1. Jednoduché spouštěče (Simple Triggers)
Jsou definovány přímo v kódu použitím specifického názvu funkce:
- onOpen(e) – spouští se při otevření dokumentu
- onEdit(e) – spouští se při změně hodnoty v buňce tabulky
- onSelectionChange(e) – spouští se při změně výběru v tabulce
- doGet(e) / doPost(e) – spouští se při HTTP požadavku na webovou aplikaci
Omezení jednoduchých spouštěčů:
- Musí být vázány na Google dokument
- Nespouštějí se v režimu pouze pro čtení
- Nemohou používat služby vyžadující autorizaci (např. Gmail)
- Běží maximálně 30 sekund
2. Instalovatelné spouštěče (Installable Triggers)
Nabízejí větší flexibilitu, ale vyžadují explicitní instalaci:
- Časové – spouštění v určitý čas nebo v pravidelných intervalech
- Události – reagují na konkrétní události (otevření, úprava, změna, odeslání formuláře)
Výhody instalovatelných spouštěčů:
- Přístup k rozšířeným službám vyžadujícím autorizaci
- Možnost přistupovat k externím souborům
- Delší doba běhu
- Spouštění i bez přítomnosti uživatele
Nastavení spouštěče
Instalovatelné spouštěče lze vytvořit:
- Ručně – přes rozhraní „Edit > Current project’s triggers“
- Programově – pomocí ScriptApp API:
function createTimeTrigger() {
ScriptApp.newTrigger('minuteFunction')
.timeBased()
.everyMinutes(5)
.create();
}
Rozdíl mezi onEdit a onChange triggery
- onEdit reaguje pouze na přímou změnu hodnoty buňky uživatelem
- onChange zachytí jakoukoliv změnu v dokumentu, včetně změn struktury, komentářů nebo importovaných dat
V. Popis požadovaného výstupu
Jasná definice očekávaného výstupu je klíčová pro úspěšnou implementaci skriptu.
Typy výstupů
Skript může produkovat různé typy výstupů:
- Úprava dat – změna hodnot v tabulce, formátování, filtrování
- Vytvoření nového obsahu – generování dokumentů, prezentací, tabulek
- Komunikace – odesílání e-mailů, vytváření kalendářních událostí, notifikace
- Vizualizace – grafy, reporty, dashboardy
- Integrace – export/import dat do/z externích systémů
Specifikace výstupu
Definujte přesně, jak má výstup vypadat:
- Formát (struktura dokumentu, vzhled e-mailu)
- Obsah (jaká data, v jakém pořadí, s jakým formátováním)
- Příjemci (kdo dostane výsledky)
- Četnost (jak často se má výstup generovat)
VI. Práce s citlivými daty a správa API klíčů
Pokud váš skript pracuje s API klíči, hesly nebo jinými citlivými údaji, nikdy je nevkládejte přímo do kódu.
Properties Service
Google Apps Script nabízí Properties Service, který funguje jako bezpečný trezor pro ukládání nastavení a citlivých dat. K dispozici jsou tři typy úložišť:
- Script Properties – sdílené všemi uživateli skriptu
- User Properties – specifické pro každého uživatele
- Document Properties – vázané na konkrétní dokument
Příklad použití:
// Uložení API klíče (proveďte pouze jednou)
PropertiesService.getScriptProperties().setProperty('API_KEY', 'váš-tajný-klíč');
// Použití API klíče ve skriptu
var apiKey = PropertiesService.getScriptProperties().getProperty('API_KEY');
Bezpečnostní doporučení
- Omezte přístup ke skriptu jen na nezbytné uživatele
- Vyžadujte pouze nezbytná oprávnění
- Pravidelně kontrolujte a aktualizujte přístupová práva
- Používejte OAuth 2.0 pro autentizaci s externími službami
VII. Logování a debugging
Při vývoji skriptů se nevyhnete ladění a hledání chyb. GAS nabízí několik nástrojů, které vám pomohou.
Logger
Nejjednodušší způsob sledování průběhu skriptu je pomocí vestavěné služby Logger:
function myFunction() {
try {
Logger.log("Funkce začala");
var tabulka = SpreadsheetApp.getActiveSpreadsheet();
Logger.log("Získal jsem tabulku: " + tabulka.getName());
// další kód...
} catch (chyba) {
Logger.log("Nastala chyba: " + chyba.toString());
}
}
Pro zobrazení logů klikněte na „View > Logs“ nebo „Execution transcript“.
Try-Catch bloky
Pro robustní zpracování chyb používejte try-catch bloky:
try {
// kód, který může selhat
} catch (chyba) {
// zpracování chyby
Logger.log("Došlo k chybě: " + chyba.message);
// informování uživatele nebo administrátora
MailApp.sendEmail("admin@example.com", "Chyba ve skriptu", chyba.toString());
}
Auditní záznamy
Pro dlouhodobé sledování je užitečné ukládat záznamy o provedených operacích:
function zaznamenatUdalost(akce, stav, poznamka) {
var auditList = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Audit");
auditList.appendRow([new Date(), akce, stav, poznamka]);
}
VIII. Optimalizace výkonu skriptu
Google Apps Script má určitá omezení a kvóty, proto je důležité psát efektivní kód.
Minimalizace volání služeb
Každé volání služby Google (např. SpreadsheetApp, DocumentApp) je relativně pomalé. Minimalizujte počet těchto volání:
// Neefektivní způsob (mnoho volání)
for (var i = 0; i < 100; i++) {
var hodnota = sheet.getRange(i+1, 1).getValue();
// další zpracování...
}
// Efektivní způsob (jediné volání)
var hodnoty = sheet.getRange(1, 1, 100, 1).getValues();
for (var i = 0; i < hodnoty.length; i++) {
var hodnota = hodnoty[i][0];
// další zpracování...
}
Dávkové zpracování
Místo zpracování každého prvku zvlášť, používejte dávkové operace:
// Neefektivní způsob
for (var i = 0; i < 100; i++) {
sheet.getRange(i+1, 1).setValue(i);
}
// Efektivní způsob
var data = [];
for (var i = 0; i < 100; i++) {
data.push([i]);
}
sheet.getRange(1, 1, data.length, 1).setValues(data);
Cache Service
Pro ukládání často používaných dat a snížení počtu volání API využijte Cache Service:
function getData() {
var cache = CacheService.getScriptCache();
var cached = cache.get("myData");
if (cached != null) {
return JSON.parse(cached);
}
// Získání dat (pomalá operace)
var data = // ... složitý výpočet nebo volání externí služby
// Uložení do cache (max. 6 hodin)
cache.put("myData", JSON.stringify(data), 21600);
return data;
}
IX. Struktura a čitelnost kódu
Dobrá struktura kódu je základem pro snadnou údržbu a rozšiřitelnost skriptů.
Konvence pojmenování
- Používejte jasná a popisná jména pro funkce a proměnné
- Pro funkce používejte slovesa (např.
posliEmailManagerum()
) - Pro proměnné popisné názvy (
datumSplatnosti
místods
) - Buďte konzistentní ve stylu (camelCase nebo snake_case)
Modularizace kódu
Rozdělte složitější skripty do menších funkcí, kde každá má jasně definovaný účel:
function zpracujTabulku() {
var data = nactiData();
var filtrovanaData = filtrujData(data);
var vysledky = analyzujData(filtrovanaData);
ulozVysledky(vysledky);
posliOznameni(vysledky);
}
function nactiData() {
// kód pro načtení dat
}
function filtrujData(data) {
// kód pro filtrování dat
}
// atd.
Komentáře a dokumentace
Dokumentujte svůj kód pomocí komentářů, zejména u složitějších částí:
/**
* Vypočítá průměrný věk z daného rozsahu dat.
* @param {Range} rozsah Rozsah buněk obsahující věk
* @return {Number} Průměrný věk
*/
function vypocitejPrumernyVek(rozsah) {
var data = rozsah.getValues();
var suma = 0;
var pocet = 0;
// Projdi všechny buňky a započítej pouze čísla
for (var i = 0; i < data.length; i++) {
for (var j = 0; j < data[i].length; j++) {
if (typeof data[i][j] === 'number') {
suma += data[i][j];
pocet++;
}
}
}
// Vrať průměr nebo 0, pokud nejsou žádná data
return pocet > 0 ? suma / pocet : 0;
}
X. Praktický příklad – Kompletní řešení
Pojďme spojit předchozí koncepty do kompletního řešení. Vytvoříme skript, který:
- Každý den kontroluje tabulku projektů
- Identifikuje projekty s blížícím se termínem (méně než 7 dní)
- Posílá e-mailové upozornění odpovědným osobám
/**
* Hlavní funkce, která kontroluje termíny projektů a posílá upozornění.
* Tato funkce by měla být nastavena jako denní časový spouštěč.
*/
function kontrolaTerminuProjektu() {
try {
// Získání aktivní tabulky a listu
var tabulka = SpreadsheetApp.getActiveSpreadsheet();
var list = tabulka.getSheetByName("Projekty");
// Načtení všech dat z listu
var data = list.getDataRange().getValues();
// Příprava seznamu projektů s blížícím se termínem
var bliziciSeProjekty = [];
var dnesniDatum = new Date();
// Předpokládáme, že tabulka má záhlaví s názvy sloupců
// Sloupce: Název projektu, Odpovědná osoba, Termín dokončení, Email
var indexNazev = 0;
var indexOsoba = 1;
var indexTermin = 2;
var indexEmail = 3;
// Procházení dat (přeskočení záhlaví, proto i = 1)
for (var i = 1; i < data.length; i++) {
var radek = data[i];
var nazevProjektu = radek[indexNazev];
var odpovednaOsoba = radek[indexOsoba];
var email = radek[indexEmail];
// Převod textového termínu na datum
var terminDokonceni = new Date(radek[indexTermin]);
// Výpočet rozdílu dnů
var rozdilDnu = Math.floor((terminDokonceni - dnesniDatum) / (1000 * 60 * 60 * 24));
// Kontrola, zda je termín v příštích 7 dnech
if (rozdilDnu >= 0 && rozdilDnu <= 7) {
bliziciSeProjekty.push({
nazev: nazevProjektu,
osoba: odpovednaOsoba,
email: email,
termin: terminDokonceni.toLocaleDateString(),
zbyva: rozdilDnu
});
}
}
// Logování pro účely ladění
Logger.log("Nalezeno " + bliziciSeProjekty.length + " projektů s blížícím se termínem");
// Pokud existují projekty s blížícím se termínem, pošleme e-maily
if (bliziciSeProjekty.length > 0) {
posliUpozorneni(bliziciSeProjekty);
}
// Záznam o úspěšném provedení
zaznamenatUdalost("Kontrola termínů", "Úspěch", "Zkontrolováno " + (data.length - 1) + " projektů");
} catch (chyba) {
// Záznam o chybě
Logger.log("Chyba při kontrole termínů: " + chyba.toString());
zaznamenatUdalost("Kontrola termínů", "Chyba", chyba.toString());
// Informování administrátora
var adminEmail = PropertiesService.getScriptProperties().getProperty('ADMIN_EMAIL');
if (adminEmail) {
MailApp.sendEmail(adminEmail, "Chyba při kontrole termínů projektů", chyba.toString());
}
}
}
/**
* Posílá e-mailová upozornění odpovědným osobám.
* @param {Array} projekty Seznam projektů s blížícím se termínem
*/
function posliUpozorneni(projekty) {
// Seskupení projektů podle e-mailu odpovědné osoby
var projektyPodleEmailu = {};
for (var i = 0; i < projekty.length; i++) {
var projekt = projekty[i];
var email = projekt.email;
if (!projektyPodleEmailu[email]) {
projektyPodleEmailu[email] = [];
}
projektyPodleEmailu[email].push(projekt);
}
// Odeslání e-mailů jednotlivým odpovědným osobám
for (var email in projektyPodleEmailu) {
var projektySObdobnymTerminem = projektyPodleEmailu[email];
var osoba = projektySObdobnymTerminem[0].osoba;
// Vytvoření obsahu e-mailu
var predmet = "Upozornění na blížící se termíny projektů";
var obsah = "Dobrý den " + osoba + ",\n\n";
obsah += "v následujících 7 dnech mají termín dokončení tyto projekty:\n\n";
for (var j = 0; j < projektySObdobnymTerminem.length; j++) {
var p = projektySObdobnymTerminem[j];
obsah += "- " + p.nazev + " - termín: " + p.termin +
" (zbývá " + p.zbyva + " dní)\n";
}
obsah += "\nS pozdravem,\nAutomatický systém";
// Poslání e-mailu
MailApp.sendEmail(email, predmet, obsah);
// Záznam o odeslání e-mailu
zaznamenatUdalost("Odeslání upozornění", "Úspěch", "E-mail odeslán na " + email);
}
}
/**
* Zapisuje záznam o události do auditního listu.
* @param {String} akce Typ prováděné akce
* @param {String} stav Výsledný stav (Úspěch/Chyba)
* @param {String} poznamka Dodatečné informace
*/
function zaznamenatUdalost(akce, stav, poznamka) {
try {
var tabulka = SpreadsheetApp.getActiveSpreadsheet();
var auditList = tabulka.getSheetByName("Audit");
// Pokud list neexistuje, vytvoříme ho
if (!auditList) {
auditList = tabulka.insertSheet("Audit");
auditList.appendRow(["Datum a čas", "Akce", "Stav", "Poznámka"]);
}
// Přidání záznamu
auditList.appendRow([new Date(), akce, stav, poznamka]);
} catch (e) {
// Pokud selže i logování, alespoň vypíšeme chybu do konzole
Logger.log("Chyba při zápisu do auditního logu: " + e.toString());
}
}
/**
* Vytvoří časový spouštěč pro kontrolu termínů.
* Tuto funkci spusťte ručně pouze jednou pro nastavení denní kontroly.
*/
function nastavDenniKontrolu() {
// Odstranění existujících spouštěčů stejného typu
var triggery = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggery.length; i++) {
if (triggery[i].getHandlerFunction() === "kontrolaTerminuProjektu") {
ScriptApp.deleteTrigger(triggery[i]);
}
}
// Vytvoření nového denního spouštěče
ScriptApp.newTrigger("kontrolaTerminuProjektu")
.timeBased()
.atHour(8) // Spuštění v 8:00 ráno
.everyDays(1) // Každý den
.create();
Logger.log("Denní kontrola termínů nastavena na 8:00");
}
XI. Pokročilé koncepty
Verzování a správa změn
Pro sledování změn ve vašem kódu:
- Využívejte vestavěné verzování v editoru Apps Script
- Pro větší projekty zvažte export do systému Git
- Dokumentujte změny pomocí komentářů a popisu verzí
Testování skriptů
Než nasadíte skript do ostrého provozu:
- Vytvořte testovací kopii vašich dat
- Implementujte unit testy pro klíčové funkce
- Postupně testujte individuální komponenty
- Proveďte end-to-end test celého procesu
Uživatelské rozhraní
Pro vylepšení interakce s uživateli můžete vytvořit:
- Vlastní menu v dokumentech a tabulkách
- Dialogová okna a postranní panely
- Formuláře pro zadávání parametrů
- Webové aplikace s plnohodnotným UI
Integrace s externími službami
GAS umožňuje:
- Komunikaci s API třetích stran pomocí UrlFetchApp
- Import/export dat z/do externích systémů
- Integraci s dalšími Google službami (např. YouTube, Maps)
- Vytváření vlastních API pomocí webových aplikací
XII. Nejčastější chyby a jejich řešení
Překročení časového limitu
Pokud váš skript běží déle než je povolený limit:
- Rozdělte úlohu na menší části
- Používejte více spouštěčů místo jednoho dlouhého procesu
- Implementujte pokračovací tokeny pro zpracování po částech
Rate Limity a Quotas
Pro překonání limitů služeb:
- Implementujte exponenciální čekání mezi pokusy (backoff)
- Používejte dávkové zpracování místo individuálních operací
- Monitorujte využití kvót a přizpůsobte strategie
Problémy s oprávněními
Když se skript nemůže dostat k potřebným zdrojům:
- Zkontrolujte, zda má uživatel potřebná oprávnění
- Ujistěte se, že skript je autorizován pro všechny používané služby
- U instalovatelných spouštěčů ověřte, že jsou nastaveny s odpovídajícími oprávněními
XIII. Shrnutí a další kroky
Kdy používat Google Apps Script
GAS je ideální pro:
- Automatizaci opakujících se úkolů v Google Workspace
- Vytváření vlastních funkcí pro Tabulky
- Propojení různých Google služeb
- Jednoduché webové aplikace integrované s Google službami
Kde hledat další informace
Pro rozšíření znalostí:
- Oficiální dokumentace Google Apps Script
- Komunita StackOverflow s tagem [google-apps-script]
- Google Developers YouTube kanál
- Blogy a tutoriály zaměřené na GAS
Příklady projektů pro inspiraci
- Automatické generování reportů z dat v tabulkách
- Systém pro schvalování dokumentů s notifikacemi
- Vlastní formuláře s pokročilou validací a logikou
- Dashboard pro monitorování a vizualizaci dat
Google Apps Script je mocný nástroj, který kombinuje jednoduchost s rozsáhlými možnostmi. Ať už jste začátečník, který chce zautomatizovat rutinní úkoly, nebo zkušený vývojář hledající způsob, jak efektivně rozšířit možnosti Google Workspace, tento průvodce vám poskytne pevný základ pro úspěšné psaní skriptů.
Pamatujte, že jako u každého programování, i zde platí, že praxe dělá mistra. Začněte s jednoduchými skripty, postupně přidávejte složitější funkce a brzy budete schopni vytvářet sofistikované automatizace, které výrazně zvýší vaši produktivitu.