top of page
blog_zahlavi_pozadi_00.jpg

Blog

  • Obrázek autoraJan Hora

Lekce 10 – práce s šablonami – Diplomy III

V minulé lekci jsme si napsali funkci, která nám sečetla bodová hodnocení za jednotlivé disciplíny a nyní se můžeme pustit do toho hlavního. Napíšeme si funkci, která z šablony vyrobí Google dokument, text volitelných polí nahradí údaji z tabulky a dokument pak uloží jako PDF soubor.

První funkce vyrob_diplomy nám načte z tabulky seznam všech dětí a pro ty, které mají dostat diplom, zavolá funkci, která diplom vytvoří.


function vyrob_diplomy(){

var folder = DriveApp.getFolderById(setup.vystup_folder_id);

var arr_tiskni = [];

var sheet_celkem = SpreadsheetApp.getActive().getSheetByName(setup.sheet_soucty_name);

var pocet_radku = sheet_celkem.getLastRow() - 1;

var hodnoty = sheet_celkem.getRange(setup.start_row, 2, pocet_radku, 3).getValues();

for(var i=0; i < hodnoty.length; i++){

if(hodnoty[i][2] == 'Ano'){

vytvor_diplom(hodnoty[i], folder);

}

}

SpreadsheetApp.getUi().alert('Diplomy hotovy.');

}


Hotové dokumenty i PDF soubory budeme vytvářet ve složce Výstup, její ID máme uložené v proměnné setup.vystup_folder_id na začátku skriptu.

Složku si uložíme do proměnné folder abychom ji dále mohli předat volané funkci.

var folder = DriveApp.getFolderById(setup.vystup_folder_id);

Dál si najdeme list Celkem a podobně jako při výpočtu součtů z něj načteme údaje všech dětí.

SpreadsheetApp.getActive().getSheetByName(setup.sheet_soucty_name);

var pocet_radku = sheet_celkem.getLastRow() - 1;

var hodnoty = sheet_celkem.getRange(setup.start_row, 2, pocet_radku, 3).getValues();

Všimněte si, že oblast, ze které čteme začíná na řádku 2 (setup.start_row) a ve sloupci 2, čili v buňce B2 a že načítáme celkem 3 sloupce.

Je to z toho důvodu, že potřebujeme jména dětí, počty jejich bodů a ještě sloupec s Ano/Ne abychom věděli, zda jim diplom tisknout.

Data máme, v cyklu je projdeme a pokud bude ve třetím prvku pole hodnota Ano, zavoláme funkci pro vytvoření diplomu. Kromě řádku hodnot jí předáme i složku, ve které má dokumenty vytvořit.

for(var i=0; i < hodnoty.length; i++){

if(hodnoty[i][2] == 'Ano'){

vytvor_diplom(hodnoty[i], folder);

}

}

SpreadsheetApp.getUi().alert('Diplomy hotovy.');

Na konci pak ukážeme jednoduchou hlášku abychom věděli, že skript doběhl.

No a zbývá funkce vytvor_diplom, ta bude vypadat takto.

function vytvor_diplom(hodnoty, folder){

var novy_dokument = vyrob_kopii_sablony(hodnoty[0], folder);

var body = novy_dokument.getBody();

body.replaceText('{jmeno}', hodnoty[0]);

body.replaceText('{pocet_bodu}', hodnoty[1]);

novy_dokument.saveAndClose();

var doc_final = DocumentApp.openById(novy_dokument.getId());

var pdf = doc_final.getAs('application/pdf')`

var file = folder.createFile(pdf).setName(hodnoty[0])

}

Nejprve si ze šablony vyrobíme kopii a uložíme ji do složky Výstup. Dokument bude mít jméno shodné s jménem soutěžícího.

var novy_dokument = vyrob_kopii_sablony(hodnoty[0], folder);

Funkce vyrob_kopii_sablony bude vypadat takto.


function vyrob_kopii_sablony(file_name, folder){

var sablona = DriveApp.getFileById(setup.sablona_id);

var file = sablona.makeCopy(file_name, folder);

return DocumentApp.openById(file.getId());

}

Vidíte, že je velmi jednoduchá, otevře šablonu, vyrobí z ní kopii, pak otevře kopii a vrátí ji.

Jen si všimněte, že šablonu otevíráme přes knihovnu DriveApp, kdežto kopii otevíráme pomocí knihovny DocumentApp. Má to jednoduchý důvod.

Když Google Dokument otevřeme knihovnou DocumentApp, pak získáme objekt Document, který má k dispozici metody, kterými můžeme do dokumentu doplňovat text, měnit nastavení stránek apod.

Seznam všech metod pro Document si můžete prohlédnout na této stránce.

Ale objekt Document už nemá nástroje třeba na to, abychom ho přesunuli do jiné složky.

Pokud s ním tedy potřebujeme pracovat jako s libovolným souborem, v našem případě vyrobit jeho kopii, musíme ho otevřít pomocí knihovny DriveApp.

No a v kopii už potřebujeme měnit texty, takže kopii si otevřeme knihovnou DocumentApp a objekt Document vrátíme.


A ještě pár poznámek ke zbytku funkce vytvor_diplom.

var body = novy_dokument.getBody();

body.replaceText('{jmeno}', hodnoty[0]);

body.replaceText('{pocet_bodu}', hodnoty[1]);

novy_dokument.saveAndClose();

var doc_final = DocumentApp.openById(novy_dokument.getId());//znovu otevři

var pdf = doc_final.getAs('application/pdf');

var file = folder.createFile(pdf).setName(hodnoty[0]);

Potřebujeme v dokumentu nahradit text jiným textem metodou replaceText(), která je k dispozici pro Body dokumentu, nejprve tedy z celého dokumentu získáme jeho Body.

V něm pak nahradíme text {jmeno} jménem soutěžícího a {pocet_bodu} počtem bodů, které v soutěži získalo.

Pokud bychom v téhle chvíli z dokumentu vyrobili PDF soubor, zjistili bychom, že v PDF souboru máme pořád původní texty {jmeno} a {pocet_bodu}.

Proto musíme nejdřív dokument uložit metodou saveAndClose() aby se provedené změny do dokumentu promítly.

Protože uložení soubor zároveň zavřelo, musíme si ho znovu otevřít, využijeme to, že známe jeho ID.

Řádek

var pdf = doc_final.getAs(‘application/pdf’);

nám z dokumentu vyrobí jeho PDF obsah, který na dalším řádku uložíme na Disk jako soubor a zároveň mu nastavíme jméno dotyčného dítěte.

var file = folder.createFile(pdf).setName(hodnoty[0]);

No a zbývá už jenom drobnost, volání obou hlavních funkcí si doplnit do menu naší tabulky abychom je mohli pohodlně volat.

Provedeme to touto funkcí jak už jsme si ukázali v jedné z prvních lekcí.

function onOpen(e) {

SpreadsheetApp.getUi()

.createMenu('DIPLOMY')

.addItem('Sečti výsledky', 'secti_body')

.addItem('Vyrob diplomy', 'vyrob_diplomy')

.addToUi();

}

Po znovu načtení tabulky se nám v menu objeví nová položka DIPLOMY ze které můžeme volat obě funkce.

Vše by pak fungovalo tak, že bychom počkali až jednotliví porotci přidělí body za všechny soutěže, potom bychom z Menu spustili Sečti výsledky.

Abych nemusel ručně zadávat náhodné výsledky za 4 disciplíny, pomohl jsem si funkcí

=RANDBETWEEN(0;10);

kterou jsem rozkopíroval všem dětem do sloupce C u jednotlivých disciplín. Funkce jak už z názvu asi odhadnete vygeneruje náhodné číslo, v tomto případě v rozmezí 0 až 10.

No a abychom nemuseli ručně počítat kolik dětí diplom dostane, zadal jsem na listu Celkem do buňky G2 vzorec

=COUNTIF(D2:D100;”=Ano”);

Funkce COUNTIF spočítá počet hodnot v zadaném rozsahu, tedy v oblasti D2:D100, které vyhovují zadané podmínce. V našem případě je podmínka aby se hodnota v buňce rovnala Ano.

V buňce G3 je ještě funkce =COUNTA(B2:B100), která nám spočítá celkový počet dětí v našem seznamu.

Po sečtení bodů tedy hned vidíme kolik diplomů nám vyšlo, případně upravíme limit v buňce G1 a body znovu sečteme.

Pokud vyjde počet diplomů v rozumném rozmezí, tak aby nám kromě diplomů vyšly i sladkosti pro děti, spustíme druhou funkci Vyrob diplomy.

Po doběhnutí funkce se přepneme na Disk do složky Výstup, a hotové diplomy v PDF souborech vytiskneme.


S dotazy se na nás neváhejte obrátit na ahoj@appsatori.eu


bottom of page