Lekce 5 - Google Apps Script - Získání externích dat - Kurzy ČNB I
Minule, v lekci Google Apps Script - Časové spouštěče, jsme si ukázali jednoduchý časový spouštěč, který jen aktualizoval datum a čas v buňce tabulky.
Dnes si ukážeme trochu praktičtější příklad.
Kurzovní lístek ČNB
Napíšeme si skript, který bude každý den stahovat devizové kurzy ČNB a ukládat je do tabulky, každý den na samostatný list.
A vyzkoušíme si ještě jednu novinku, skript nebudeme přibalovat k tabulce, ale vytvoříme ho jako samostatný soubor. A jako bonus si něco málo povíme o ladění skriptů.
Bude to trochu delší povídání, celý příklad jsem proto rozdělil na tři části.
Vytvoření skriptu a tabulky
Na Disku klikneme na Přidat, založíme si novou tabulku a
pojmenujeme ji např. Kurzy ČNB
. Opět na Disku klikneme na
Přidat a rozbalíme si poslední možnost
Více. Pokud v nabídce máme položku Google Apps
Script, vybereme ji a otevře se nám nová záložka s editorem
skriptů.
Pokud nám Google Apps Script v nabídce chybí, přečtěte si návod, jak ho do nabídky doplnit a k vašemu Disku aplikaci připojte.
Kdo si chce ušetřit práci s psaním, může si hotové skripty otevřít
na této
adrese.
Přes volbu Soubor - Vytvořit kopii si je pak můžete uložit
na svůj Disk.
Má tabulka s kurzy je k nahlédnutí tady. Je nasdílená pouze pro prohlížení, vaše skripty do ní zapisovat tedy nemohou. Můžete se ale podívat, jestli moje skripty fungují a plní tabulku novými kurzy.
Máme tedy jednu záložku s tabulkou a druhou záložku s editorem skriptů. Editor vypadá úplně stejně, jako když jsme vytvářeli skript připojený k tabulce.
I další postup je stejný, tedy klikneme na název Projekt bez
názvu a nějak svůj první skript pojmenujeme, např.
KurzyCNB
.
Kroky řešení
Můžeme se pustit do přemýšlení, jak náš úkol vyřešit. Jedna z hlavních zásad programování je rozdělit si zadání na menší části, které budou snáze pochopitelné a řešitelné. U takto jednoduché úlohy s tím nebude problém a jednotlivé kroky si můžeme rovnou vypsat:
- otevření tabulky
- vytvoření listu s názvem podle dnešního data
- získání kurzů ČNB pro dnešní den
- zápis kurzů na list tabulky
Až nám bude vše fungovat, vytvoříme časový spouštěč, který se bude denně spouštět a kurzy ukládat do tabulky.
Jdeme na to.
1 - Otevření tabulky
Dokud jsme měli skript přibalený k tabulce, mohli jsme tabulku získat metodou:
var tabulka = SpreadsheetApp.getActive();
Čili "vezmi právě aktivní tabulku", tedy tu, ke které je skript připojený. Teď máme skript jako samostatný soubor a žádnou připojenou tabulku nemá, proto musíme tabulku získat jinak.
ID tabulky
Dvě nejjednodušší možnosti jsou najít ji podle jejího ID, nebo podle adresy (URL).
URL je to, co je zapsané v adresním řádku, pokud máte vaši tabulku otevřenou. Má tabulka vypadá takto:
Orámovaná část je URL, podtržená část mezi dvěma lomítky je ID tabulky. Do svého editoru skriptů si jednoduše zkopírujeme URL, nebo z něj vybereme jen ID a tabulku pak otevřeme jedním z těchto způsobů:
function otevri_tabulku() { var url = 'https://docs.google.com/spreadsheets/d/14Ek-0DeVwmanKWMcLUIChKLUbWKnSjGWvPrQTuxJBRs/edit#gid=1736117475'; var tabulka = SpreadsheetApp.openByUrl(url); return tabulka } function otevri_tabulku() { var id = '14Ek-0DeVwmanKWMcLUIChKLUbWKnSjGWvPrQTuxJBRs'; var tabulka = SpreadsheetApp.openById(id); return tabulka }
Oba výše uvedené způsoby jsou shodné, vyberte si, který uznáte za vhodný.
Parametrizace funkce
URL i ID jsme napevno zadali do funkce, ale funkce by spíš měla ID dostat jako parametr a měla by tedy vypadat spíše takto:
function otevri_tabulku(id) { return SpreadsheetApp.openById(id) }
Funkci pak můžeme volat pokaždé s jiným ID. Jinými slovy, stejný skript může fungovat univerzálně a ukládat kurzy ČNB do libovolné tabulky, nebo několika různých tabulek. Jedinou podmínkou je, aby měl k tabulce přístup a mohl do ní zapisovat. Jinak je úplně jedno, komu tabulka patří, nebo na kterém Disku leží.
Co by se stalo, pokud by skript k tabulce přístup neměl? Pak ji samozřejmě nedokáže otevřít a skript havaruje. Pro reálné použití by tuto situaci bylo potřeba ošetřit, skript by měl chybu zapsat do nějakého logu a případně nám poslat e-mail o tom, kde došlo k chybě, o jakou tabulku se jedná a podobně.
Abychom id nebo url tabulky neměli zapsané přímo ve funkci, založíme si globální proměnnou, do které si id tabulky uložíme. Globální proměnná je automaticky dostupná kdekoli ve skriptu:
var table_id = '14Ek-0DeVwmanKWMcLUIChKLUbWKnSjGWvPrQTuxJBRs';
Vy si samozřejmě do svých skriptů dejte id své tabulky, do mé nemáte možnost zapisovat.
Definici proměnné vložíme hned na začátek skriptu, aby byla k dispozici, než se začne provádět funkce, která ji bude vyžadovat.
Pokud jste trochu zběhlejší v jazyce JavaScript, pak asi víte, že u globálních proměnných hrozí, že použijeme stejný název globální proměnné na jiném místě programu a přepíšeme si původní hodnotu. Ale to u našeho miniskriptu nehrozí, takže můžeme globální proměnnou klidně použít.
A ještě jedna poznámka. Naše proměnná
table_id
se nebude v průběhu skriptu měnit a je to tedy vlastně
konstanta. Není to žádné dogma, ale často se pro proměnné, které se
nemění, používají názvy psané velkými písmeny. Takže místo
table_id
bychom použili název TABLE_ID
. Program je
pak pro nás lépe čitelný a srozumitelný.
Protože má funkce pro otevření tabulky v podstatě jeden řádek, nebudeme ji ani jako samostatnou funkci psát, ale tabulku si otevřeme ve funkci, která bude vytvářet list pro dnešní den.
2 - Vytvoření listu s názvem podle dnešního data
Tabulku otevřít umíme a teď v ní potřebujeme vytvořit list s názvem shodným s dnešním datem. Napíšeme si tedy funkci, která jako parametry dostane dnešní datum a id tabulky. Vrátí pak list s názvem podle data. Je potřeba si připomenout, že tabulka nemůže mít 2 listy se shodným názvem. Funkci si ukážeme:
function zaloz_list(dnes, tabulka) { var sheet = tabulka.getSheetByName(dnes); // najdi v tabulce list podle jména if(sheet == null) { // list neexistuje sheet = tabulka.insertSheet(dnes); // vytvoř list } return sheet; // vrať list }
Myslím, že funkčnost je celkem jasná. Funkce se pokusí najít list podle názvu. Pokud neexistuje, vytvoří ho. List pak vrátí.
Líbí se vám Apps Script a tento seriál?
A dočetli jste až do konce?
Pak nezapomeňte na hodnocení
A pište mi připomínky i dotazy do komentářů, budu rád za každou zpětnou vazbu.
V další části, Google Apps Script - Získání externích dat - Kurzy ČNB II, se pustíme do čtení a zpracování dat z ČNB.