V předchozím článku Google Forms a Google Apps Script – registrace na událost a odeslání registračního e-mailu jsme s využitím Google Forms a Google Apps Script provedli registraci na událost a automaticky odeslali registrační e-mail registrovanému. Protože je ale u spousty registrací třeba zaslat i registrační číslo, což v předchozím návodu chybělo, rozšíříme předchozí návod o tuto možnost. Pro další postup si proto musíme zprovoznit registraci podle předchozího návodu.
Pokud by byl s předchozím návodem nějaký problém, napište mi do komentářů pod odkazovaný článek, pokusím se pak návod případně upravit či poradit, kde by mohl být problém.
K dalšímu postupu musíme probrat trochu teorie o tom, jak jsou data z registračního formuláře ukládána do Tabulek Google a následně z této Tabulky Google vkládána do registračního e-mailu.
Sloupce v tabulce odpovídají jednotlivým otázkám z registračního formuláře, o tom jsem se zmínili už dříve. Z toho logicky plyne, že řádky v tabulce odpovídají jednotlivým registrovaným. Zkusme si udělat několik testovacích registrací, aby to bylo více zřejmé. Níže vidíte registrace několika účastníků, kdy každý řádek s vyjímkou toho prvního obsahuje údaje od jednotlivých registrovaných. První řádek obsahuje záhlaví odpovídající otázkám z registračního formuláře.
Cestou registračního formuláře vytvořeného v Google Forms jsou data uložena do Tabulky Google, kterou vidíme výše. Z Tabulky Google (vždy z aktuálního řádku) jsou data pomocí Google Apps Scriptu uložena do proměnných, tato data jsou dále zpracována námi vytvořenou funkcí a odeslána na vyplněnou e-mailovou adresu.
Námi vytvořená funkce odeslaniRegistracnihoEmailu získává hodnoty do proměnných vždy z aktuálního řádku z Tabulky Google. Pokud by jsme chtěli do další proměnné načíst i předvyplněné registrační číslo (jiné pro každého účastníka) a toto registrační číslo zaslat e-mailem, jeví se jako nejjednodušší možnost přidat do tabulky nový sloupec, do kterého by jsme předvyplnili registrační čísla. Tento způsob je vidět na následujícím obrázku.
S další registrací, která by se nám zapsala na řádek 5, by jsme měli mít s nově zapsaným registrovaným účastníkem svázáno registrační číslo 1 a mohli bychom s tímto číslem dále pracovat za pomoci funkce odeslaniRegistracnihoEmailu.
Bohužel ale tato možnost nefunguje, neboť pokud máme dopředu cokoliv napsáno v aktivním listu Tabulky Google, do kterého se zapisují hodnoty z Google Forms (automaticky označeného jako Odpovědi formuláře 1 – bude se opět lišit dle jazykové mutace), tak jsou tyto hodnoty odsunuty s každým zápisem prostřednictvím Google Forms o řádek níže, jak je ukázáno na dalším obrázku.
S tímto zjištěním musíme pro předvyplněné registrační čísla použít jiný list než je list, do kterého se zapisují hodnoty z Google Forms. K přidání nového listu v Google Tabulce použijeme tlačítko + umístěné v levém dolním rohu Tabulek Google, jak je vidět na obrázku dole.
Nově přidaný list si přejmenujeme na seznamRegCisel a do prvního sloupce doplníme registrační čísla od 1 do 20, kdy první řádek bude obsahovat název Registrační číslo, jak je vidět na dalším obrázku.
Přes nabídku Nástroje >> Editor scriptu spustíme editor pro Google Apps Script.
A současnou funkci odeslaniRegistracnihoEmailu nahradíme touto upravenou funkcí:
function odeslaniRegistracnihoEmailu(e) {
// do promennych casovaZnacka, jmeno, prijmeni, emailUcastnika a regCislo budeme ukladat hodnoty z Tabulky Google
var casovaZnacka = e.values[0]; // cisla sloupcu se tady pocitaji od 0, misto e.values[0] lze použít e.namedValues["Časová značka"]
var jmeno = e.namedValues["Jméno"];
var prijmeni = e.namedValues["Příjmení"];
var emailUcastnika = e.values[3]; // místo e.values[3] se dá použít e.namedValues["E-mail"]
var aktualniList = SpreadsheetApp.getActiveSheet(); //do promenne aktualniList ulozime aktivni list, tzn. ten list, kam se ukladaji vysledky z reg. formulare
var aktualniRadek = aktualniList.getActiveSelection().getRowIndex(); //do promenne aktualniRadek ulozime radek s hodnotami od aktualne registrovaneho uzivatele
var pomocnyList = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("seznamRegCisel"); // definujeme pomocnyList, ktery navazeme na list oznaceny jako seznamRegCisel
var regCislo = pomocnyList.getRange(aktualniRadek,1).getValue(); // reg. cisla ucastniku, musime predvyplnit na pomocnem listu, cislo 1 nam znaci 1 sloupec, zde se cisla sloupcu pocitaji od 1
var predmetEmailu = "Testovací registrační e-mail"; // promenna pro hodnotu predmetu e-mailu
var celeJmeno = jmeno + " " + prijmeni; // do promenne celeJmeno ulozime hodnotu z promenne jmeno a prijmeni vcetne mezery
var teloEmailuHtml =
"Vážený pane/paní " + prijmeni + ",<br/>" +
"<br/>" +
"děkujeme Vám za registraci přes náš testovací registrační formulář, která byla provedena " + casovaZnacka + ".<br/>" +
"<br/>" +
"Údaje, které jste vložil(a) do našeho registračního formuláře, jsou následující:<br/>" +
"Vaše celé jméno: <b>" + celeJmeno + "</b><br/>" +
"E-mail: <b>" + emailUcastnika + "</b><br/>" +
"<br/>" +
"Vaše registrační číslo (variabilní číslo pro platbu) je <b>" + regCislo + "</b>.<br/>" +
"<br/>" +
"S pozdravem<br/>" +
"<br/>" +
"Organizační tým<br/>" +
"<br/>" +
"<i>Vytvořeno dle návodu zveřejněného na webu http://www.aldacerny.cz.</i>";
// <b> a </b> jsou parove html znacky pro tucne pismo
// <i> a </i> jsou parove html znacky pro kurzivu
// <br/> je nepárová html značka pro nový řádek
MailApp.sendEmail(emailUcastnika, predmetEmailu, "", {'htmlBody':teloEmailuHtml}); //odesle e-mail na e-mailovou adresu ucastnika
pomocnyList.getRange(aktualniRadek,2).setValue("Pouzito"); // po odeslani emailu vyplni Pouzito do druheho sloupce na listu seznamRegCisel
}
Popis jednotlivých částí funkce najdeme přímo v kódu funkce, kdy začátek komentář začíná vždy jako // a nemá na samotný průběh funkce žádný vliv.
Výsledek bude vypadat jako na obrázku dole, po úpravě nesmíme opět zapomenout uložit změny, použijeme k tomu ikonu diskety dostupnou v horní liště.
Před prvním spuštěním takto upravené registrace by jsme měli ještě z Tabulky Google vymazat předchozí provedené registrace. Aby jsme zajistili to, že se další provedená registrace propíše na druhý řádek tabulky (první řádek obsahuje záhlaví), musíme stávající řádky s provedenými registracemi označit, pravým myšítkem vyvolat nabídku a z ní zvolit Odstranit řádky, jak vidíte na obrázku dole. Pokud by jsme vymazali pouze obsah řádků, tak se nová registrace nezapíše na druhý řádek v tabulce, ale až na řádek, který bude následovat za tím, kde byly doposud provedeny předchozí registrace i když budou předchozí řádky „prázdné“.
Po oficiálním spuštění registrace nesmíme zapomenout, že registrační funkce odeslaniRegistracnihoEmailu pracuje vždy s aktuálním řádkem, který se vztahuje i na aktuální řádek v pomocném listu označeném jako seznamRegCisel. Z tohoto důvodu při probíhající registraci nikdy neodstraňujeme řádek s osobou, která danou registrací zruší (nezaplatí), ale pouze daný řádek podbarvíme a stejný řádek podbarvíme i na pomocném listu. Pokud by jsme řádek odstranili, tak by došlo k tomu, že zašleme jedno registrační číslo více osobám, neboť číslo aktuálního řádku se nám v registrační tabulce sníží o jednu hodnotu, která pak bude odpovídat hodnotě řádku na pomocném listu, na kterém se bude nacházet již jednou odeslané číslo.
Na obrázku níže vidíme registrační tabulku s několika registrovanými, kdy účastníka na řádku 4 jsme zrušili, tzn. podbarvili jsme řádek 4.
Na dalším obrázku je vidět pomocný list seznamRegCisel, kde jsme řádek 4 opět podbarvili a zrušené registrační číslo jsme ručně zkopírovali na ještě nepoužitý řádek, tzn. uvolnili jsme jej pro další registraci. Všechna ještě nepoužitá čísla jsme předtím posunuli o jeden řádek dolů. Tímto způsobem můžeme jednoduše spravovat čísla určená pro registraci.
Na posledním obrázku vidíme upravený registrační e-mail, který přijde na e-mail vyplněný při registraci.
Nedoporučuji v tabulce, do které se zapisují data z Google Formuláře, provádět příliš mnoho ručních zásahů, omezte se pouze na barevné podbarvení zrušených registrací, jinak může dojít k tomu, že se Vám registrace díky nechtěné úpravě v ten nejnevhodnější okamžik zasekne. Doporučuji mít ještě druhou tzv. pracovní tabulku, kde budete data z originální tabulky kopírovat a dále upravovat. Snížíte tím riziko možných problémů na minimum.
Občas se odborníkům z Google podaří to, že skripty přestanou znenadání fungovat, takový problém jsem zaregistroval během posledních tří let cca čtyřikrát. Problém se vždy vyřešil sám max do 12 hodin, jednou došlo i k tomu, že registrační e-maily chyběly v odeslaných zprávách i když samotným registrovaným byly tyto zprávy doručeny bez nejmenšího problému. Tento problém s MailApp.sendEmail se čile probíral na fórech, náprava trvala několik týdnů. Některými „odborníky“ začala být tato nová vlastnost prohlašována za standard. 🙂