Lekce 5 — Získání externích dat — Kurzy ČNB I

Jan Hora
AppSatori
Published in
4 min readOct 21, 2019

V minulé lekci, 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říklad 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:

1. otevření tabulky
2. vytvoření listu s názvem podle dnešního data
3. získání kurzů ČNB pro dnešní den
4. zápis kurzů na list tabulky

A 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.

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.

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. Moje 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/1JUt5fcOw8o2ijA-7OODQeJqZSX9bUk3HjUTHatnGXbQ/edit#gid=1870669454';
return SpreadsheetApp.openByUrl(url);
}
function otevri_tabulku() {
var id = '1JUt5fcOw8o2ijA-7OODQeJqZSX9bUk3HjUTHatnGXbQ';
return SpreadsheetApp.openById(id);
}

Oba výše uvedené způsoby jsou shodné, vyberte si, který uznáte za vhodný.
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 třeba 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 = '1JUt5fcOw8o2ijA-7OODQeJqZSX9bUk3HjUTHatnGXbQ';

Vy si samozřejmě do svých skriptů dejte id své tabulky, do mé nemáte možnost zapisovat.

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.

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 název ve tvaru dnešního data 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 může vypadat třeba takto.

function zaloz_list(dnes, tabulka) {
var sheet = tabulka.getSheetByName(dnes);
if(sheet == null) {
sheet = tabulka.insertSheet(dnes);
}
return sheet;
}

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í.

V další lekci, se již pustíme do čtení a zpracování dat z ČNB.

--

--