IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

5. diel - Google Apps Script - Získanie externých dát - Kurzy ČNB I

Minule, v lekcii Google Apps Script - Časové spúšťače , sme si ukázali jednoduchý časový spúšťač, ktorý len aktualizoval dátum a čas v bunke tabuľky. Dnes si ukážeme trochu praktickejšie príklad.

Kurzový lístok ČNB

Napíšeme si skript, ktorý bude každý deň sťahovať devízové kurzy ČNB a ukladať ich do tabuľky, každý deň na samostatný list.

A vyskúšame si ešte jednu novinku, skript nebudeme pribaľovať k tabuľke, ale vytvoríme ho ako samostatný súbor. A ako bonus si niečo málo povieme o ladenie skriptov.

Bude to trochu dlhšie rozprávanie, celý príklad som preto rozdelil na tri časti.

Vytvorenie skriptu a tabuľky

Na Disku klikneme na Pridať, založíme si novú tabuľku a pomenujeme ju napr. Kurzy ČNB. Opäť na Disku klikneme na Pridať a rozbalíme si posledná možnosť Viac. Ak v ponuke máme položku Google Apps Script, vyberieme ju a otvorí sa nám nová záložka s editorom skriptov.

Ak nám Google Apps Script v ponuke chýba, prečítajte si návod, ako ho do ponuky doplniť ak vášmu Disku aplikáciu pripojte.

Kto si chce ušetriť prácu s písaním, môže si hotové skripty otvoriť na tejto adrese.
Cez voľbu Súbor - Vytvoriť kópiu si ich potom môžete uložiť na svoj Disk.

Má tabuľka s kurzami je k nahliadnutiu tu. Je nazdieľaná iba pre prehliadanie, vaše skripty do nej zapisovať teda nemôžu. Môžete sa ale pozrieť, či moja skripty fungujú a plní tabuľku novými kurzy.

Máme teda jednu záložku s tabuľkou a druhou záložku s editorom skriptov. Editor vyzerá úplne rovnako, ako keď sme vytvárali skript pripojený k tabuľke.

Aj ďalší postup je rovnaký, teda klikneme na názov Projekt bez názvu a nejako svoj prvý skript pomenujeme, napr. KurzyCNB.

Kroky riešenia

Môžeme sa pustiť do premýšľania, ako náš úlohu vyriešiť. Jedna z hlavných zásad programovanie je rozdeliť si zadanie na menšie časti, ktoré budú ľahšie pochopiteľné a riešiteľné. U takto jednoduché úlohy s tým nebude problém a jednotlivé kroky si môžeme rovno vypísať:

  1. otvorenie tabuľky
  2. vytvorenie listu s názvom podľa dnešného dátumu
  3. získanie kurzov ČNB pre dnešný deň
  4. zápis kurzov na list tabuľky

Až nám bude všetko fungovať, vytvoríme časový spúšťač, ktorý sa bude denne spúšťať a kurzy ukladať do tabuľky.

Ideme na to.

1 - Otvorenie tabuľky

Kým sme mali skript pribalený k tabuľke, mohli sme tabuľku získať metódou:

var tabulka = SpreadsheetApp.getActive();

Čiže "vezmi práve aktívny tabuľku", teda tú, ku ktorej je skript pripojený. Teraz máme skript ako samostatný súbor a žiadnu pripojenú tabuľku nemá, preto musíme tabuľku získať inak.

ID tabuľky

Dve najjednoduchšie možnosti sú nájsť ju podľa jej ID, alebo podľa adresy (URL).

URL je to, čo je zapísané v adresnom riadku, ak máte vašu tabuľku otvorenú. Má tabuľka vyzerá takto:

URL a ID tabuľky v Dokumentoch Google - Google API

Orámovaná časť je URL, podčiarknutá časť medzi dvoma lomkami je ID tabuľky. Do svojho editore skriptov si jednoducho skopírujeme URL, alebo z neho vyberieme len ID a tabuľku potom otvoríme jedným z týchto spôsobov:

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 vyššie uvedené spôsoby sú zhodné, vyberte si, ktorý uznáte za vhodný.

Parametrizácie funkcie

URL aj ID sme napevno zadali do funkcie, ale funkcia by skôr mala ID dostať ako parameter a mala by teda vyzerať skôr takto:

function otevri_tabulku(id) {
  return SpreadsheetApp.openById(id)
}

Funkciu potom môžeme volať zakaždým s iným ID. Inými slovami, rovnaký skript môže fungovať univerzálne a ukladať kurzy ČNB do ľubovoľnej tabuľky, alebo niekoľkých rôznych tabuliek. Jedinou podmienkou je, aby mal k tabuľke prístup a mohol do nej zapisovať. Inak je úplne jedno, komu tabuľka patrí, alebo na ktorom Disku leží.

Čo by sa stalo, ak by skript k tabuľke prístup nemal? Potom ju samozrejme nedokáže otvoriť a skript havaruje. Pre reálne použitie by túto situáciu bolo potrebné ošetriť, skript by mal chybu zapísať do nejakého logu a prípadne nám poslať e-mail o tom, kde došlo k chybe, o akú tabuľku sa jedná a podobne.

Aby sme id alebo url tabuľky nemali zapísané priamo vo funkcii, založíme si globálne premennú, do ktorej si id tabuľky uložíme. Globálna premenná je automaticky dostupná kdekoľvek v skripte:

var table_id = '14Ek-0DeVwmanKWMcLUIChKLUbWKnSjGWvPrQTuxJBRs';

Vy si samozrejme do svojich skriptov dajte id svojej tabuľky, do mojej nemáte možnosť zapisovať.

Definíciu premenné vložíme hneď na začiatok skriptu, aby bola k dispozícii, ako sa začne vykonávať funkcie, ktorá ju bude vyžadovať.

Ak ste trochu zbehlejší v jazyku JavaScript, potom asi viete, že u globálnych premenných hrozí, že použijeme rovnaký názov globálne premenné na inom mieste programu a prepíšeme si pôvodnú hodnotu. Ale to u nášho miniskriptu nehrozí, takže môžeme globálne premennú pokojne použiť.

A ešte jedna poznámka. Naše premenná table_id sa nebude v priebehu skriptu meniť a je to teda vlastne konštanta. Nie je to žiadne dogma, ale často sa pre premenné, ktoré sa nemenia, používajú názvy písané veľkými písmenami. Takže namiesto table_id by sme použili názov TABLE_ID. Program je potom pre nás lepšie čitateľný a zrozumiteľný.

Pretože má funkcie pre otvorenie tabuľky v podstate jeden riadok, nebudeme ju ani ako samostatnú funkciu písať, ale tabuľku si otvoríme vo funkcii, ktorá bude vytvárať list pre dnešný deň.

2 - Vytvorenie listu s názvom podľa dnešného dátumu

Tabuľku otvoriť vieme a teraz v nej potrebujeme vytvoriť list s názvom zhodným s dnešným dátumom. Napíšeme si teda funkciu, ktorá ako parametre dostane dnešný dátum a id tabuľky. Vráti potom list s názvom podľa dátumu. Je potrebné si pripomenúť, že tabuľka nemôže mať 2 listy so zhodným názvom. Funkciu 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čnosť je celkom jasná. Funkcia sa pokúsi nájsť údajov podľa názvu. Ak neexistuje, vytvorí ho. List potom vráti.

V ďalšej časti, Google Apps Script - Získanie externých dát - Kurzy ČNB II , sa už pustíme do čítania a spracovania dát z ČNB.

Páči sa vám Apps Script a tento seriál?
A dočítali ste až do konca?
Potom nezabudnite na hodnotenie ;-)

A píšte mi pripomienky aj otázky do komentárov, budem rád za každú spätnú väzbu.


 

Predchádzajúci článok
Google Apps Script - Časové spúšťače
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 II
Č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