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

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:

  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ž 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:

URL a ID tabulky v Dokumentech Google - Google API

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.


 

Předchozí článek
Google Apps Script - Časové spouštěče
Všechny články v sekci
Google API
Přeskočit článek
(nedoporučujeme)
Google Apps Script - Získání externích dat - Kurzy ČNB II
Článek pro vás napsal Jan Hora
Avatar
Uživatelské hodnocení:
10 hlasů
Autor se poslední 4 roky věnuje programování pro Google Suite.
Aktivity