IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

Kurzy, ako je vracia server ČNB - Google API

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:

Zoznam funkcií Apps Script na spustenie - Google API

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:

Spustenie Apps Script funkcie cez lištu - Google API

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:

Zastavená Apps Script funkcie - Google API

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:

Zastavená funkcie v Apps Script druhýkrát - Google API

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.


 

Predchádzajúci článok
Google Apps Script - Získanie externých dát - Kurzy ČNB I
Všetky články v sekcii
Google API
Preskočiť článok
(neodporúčame)
Google Apps Script - Získanie externých dát - Kurzy ČNB III
Článok pre vás napísal Jan Hora
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se poslední 4 roky věnuje programování pro Google Suite.
Aktivity