6. diel - Google Apps Script - Získanie externých dát - Kurzy ČNB II
V minulej lekcii, Google Apps Script - Získanie externých dát - Kurzy ČNB I , sme si pripravili samostatný skript, tabuľku pre dáta a napísali funkciu pre vytvorenie listu s názvom aktuálneho dňa.
Získanie kurzov ČNB pre dnešný deň
Dnešné kurzy devízového trhu v tvare vhodnom na spracovanie programom ponúka ČNB na tejto stránke.
Ak potrebujeme kurzy za iný ako aktuálny deň, doplníme na koniec adresy
ešte parameter ?date=
, doplnený dátumom, ktoré nás zaujíma.
Napr. pre kurzy z 1.9.2019 bude celá adresa vyzerať takto:
https://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt?date=01.09.2019
Ešte si môžeme ručne vyskúšať rôzne tvary dátumu a ľahko zistíme,
že funguje aj tvar 1.9.2019
, hoci ČNB píše, že deň a mesiac
má byť na 2 znaky.
Cez víkendy sa kurzy nevyhlasujú, preto nám pre sobotu a nedeľu ČNB vráti piatkové kurz. A ešte drobnosť, aj v pondelok dopoludnia nám stránka bude vracať piatkový kurz, pretože ČNB aktualizuje kurzy v pracovné dni po 14:30, ako sa môžete dočítať na tejto stránke.
Na to budeme musieť pamätať, až budeme zakladať náš časový spúšťač.
Rovnako ako id tabuľky si aj adresu servera ČNB uložíme do globálne premenné, takže začiatok nášho skriptu bude vyzerať takto:
var table_id = 'tady_bude_id_vasi_tabulky'; var kurzy_url = 'https://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt';
Pokiaľ si adresu otvoríme v prehliadači, ukážu sa nám kurzy v tomto tvare:
Vidíte, že ide o jednoduchý textový formát, žiadne XML alebo podobné zložitosti. Z prvého riadku môžeme získať dátum, aby sme kurzy zapísali na správny list tabuľky a tiež overili, že nám ČNB vrátila kurz, ktorý nás zaujíma.
Všetky ďalšie riadky náš program jednoducho prejde a obsah každého
riadku rozdelí na časti podľa znaku |
. Tým získa dáta v tvare
vhodnom pre zápis do tabuľky.
Načítanie dát
Pre vlastné načítanie dát z ČNB si napíšeme túto funkciu:
function nacti_data_z_cnb(url, datum) { var url = url || 'https://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt'; var datum = datum || '01.09.2019'; var url_cele = url + '?date=' + datum; var resp = UrlFetchApp.fetch(url_cele); var data = resp.getContentText(); return data; }
Teraz si ju trochu vysvetlíme. Vidíme, že funkcia má 2 vstupné
parametre: url
a datum
. Parameter url
je
základná adresa stránky ČNB a datum
je text v tvare
DD.MM.RRRR.
Ďalší riadok:
var url = url || 'https://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt';
nám možno príde nezmyselný. Prečo na ňom definujeme premennú
url
, keď tá by mala byť ako vstupný parameter. A k čomu je tam
operátor ||
?
operátor ||
je logický operátor OR, čiže
riadok znamená: "do premennej url
ulož hodnotu url
,
ktorá došla ako prvý parameter a ak parameter url
nie je
definovaný, ulož tam text
'https://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt'
".
Podobne ďalší riadok do premennej datum
uloží parameter
datum
alebo text '01.09.2019'
;
K čomu je to dobré? To si za chvíľu ukážeme na príklade, ako je
možné v Apps Script funkcie krokovať a hľadať v nich chyby. Pri týchto
pokusoch budeme funkciu spúšťať ručne priamo v editore a v tej chvíli
žiadne parametre url
a datum
nedostane. Preto si ich
vo funkcii nastavíme týmto spôsobom.
Na ďalšom riadku:
var url_cele = url + '?date=' + datum;
si len zostavíme výslednú adresu, ktorú budeme volať. Pre komunikáciu s
ľubovoľnou externou adresou slúži v Apps Script knižnica
UrlFetchApp
. Pomocou nej môžeme dáta ako prijímať, tak i
odosielať.
riadok:
var resp = UrlFetchApp.fetch(url_cele);
teda zavolá externý adresu a do premennej resp
uloží
výsledok. Nebudú to zatiaľ priamo naše kurzy, ale objekt triedy
HTTPResponse
, zjednodušene povedané kompletná odpoveď servera
ČNB.
Z objektu resp
teraz potrebujeme získať naše kurzy. Vo
všeobecnosti môže mať odpoveď servera najrôznejšie formát, môže to
byť obrázok, text, XML a podobne. Podľa toho je potom potrebné odpoveď
spracovať.
Vieme, že v našom prípade by odpoveď mal byť obyčajný text, takže ho
skúsime z objektu získať metódou resp.getContentText()
a
uložíme ho do premennej data
, ktorú na poslednom riadku funkcie
vráti.
Krokovanie
A teraz si skúsime sľubované krokovanie. V menu editore vyberieme voľbu Spustiť, uvidíme tam túto ponuku:
Pod Spustiť funkciu a Ladiť funkciu
uvidíme rovnaký zoznam všetkých funkcií, ktoré máme v súbore
Kód.gs
napísaný. Rozdiel je v tom, že Spustiť
funkciu iba vykoná, kdežto Ladiť nám umožní jej
vykonávanie zastaviť a potom v ňom opäť pokračovať.
Úplne rovnako ako cez menu môžeme funkciu vybrať na lište pod menu, ako to vidíte na obrázku:
Kliknutím myši na číslo riadku si ešte vložíme miesta, kde chceme vykonávanie funkcie zastaviť. Miesto je označené červenou bodkou, ďalší klik ju zase zmaže.
Kliknutím na ikonu chrobáka skúsime spustiť ladenie funkcie. Po zastavení funkcie na prvom bode (u mňa je to riadok 48) by ste mali vidieť niečo podobné ako na obrázku nižšie:
Vidíme, že vo výpise premenných máme správne nastavené hodnoty pre
url
, datum
alebo url_cele
, ale hodnota
resp
je undefined
.
Je to z toho dôvodu, že program zastaví na konkrétnom riadku pred jeho vlastným vykonaním. Ak klikneme na ikonu pre pokračovanie ladenie, mali by sa vykonať riadky 48 a 49 a celé by to malo vyzerať nejako takto:
Vidíte, že program zastavil na riadku 50. O odpovede serveru, ktorá je v
premennej resp
, sa tu nič zaujímavého nedozvieme. Vidíme len,
že je to akýsi objekt.
Naproti tomu v premennej data
vidíme začiatok kurzového
lístka, takže metódu resp.getContentText()
sme použili správne
a máme reťazec obsahujúci kurzový lístok. Ukončíme krokovanie a môžeme
pokročiť ďalej.
V skutočnej aplikácii by sme ešte nejako museli ošetriť aj stav, kedy server ČNB odpovie za dlhú dobu, neodpovie vôbec, pošle niečo iné ako kurzový lístok a podobne. V našom ukážkovom príklade to zatiaľ zanedbáme.
V budúcej lekcii, Google Apps Script - Získanie externých dát - Kurzy ČNB III , si popíšeme získanie surových dát kurzových lístkov z ČNB a ukážeme si, ako funkcie v Apps Script krokovať a hľadať v nich chyby.