Nyní již přímo formuláře nabízí možnost upozornit na novou odpověď.
Google Forms
Na webovém Přihlašovacím systému SUN jsem chtěl vložit dotazník ohledně spokojenosti při používání systému. Rozhodl jsem se využít tenkrát ještě Google Dokumenty a vytvořil jsem dotazník.
Nyní, kdy odpovědi chodí už zřídka, jsem chtěl nějak upozornit, když přijde nová odpověď. Kdo hledá, najde a tak jsem našel řešení, ze kterého jsem vycházel, dnes ho zde předvedu.
Originál na stránkách Labnol.org, o kterých se ještě zmíním.
Skriptíme
Tak už konečně začneme! Kroků je pár, a nic co by i průměrný uživatel nezvládl.
- Otevřeme si Google Drive, vytvoříme nový formulář a nastavíme si požadované otázky a uložíme
- Klikneme na tlačítko Zobrazit odpovědi. To nám otevře nové okno s tabulkou, a všemi našimi otázkami
- V novém okně vybereme v menu položku Nástroje -> Editor skriptů
- Opět máme nové okno, kde už můžeme psát náš vlastní skript. Prvotní rozcestník můžeme zavřít. Do pole Code.gs vložte níže uvedený kód.
function SendConfirmationMail(e) { try { var copy = "kopie@abc.cz" // Tvůj email, kam půjde kopie var sendername = "Pavel Kutáč"; // Jméno od koho email přišel var subject = "SUN Dotazník - odpověď"; // Předmět emailu var message = "<h1>Nová odpověď na dotazník</h1>"; //zpráva v HTML formátu //Email je v mém formuláři nepovinný, pokud jej zadá, odpověď půjde na jeho email var replyTo; var activeSheet = SpreadsheetApp.getActiveSheet(); //získáme aktivní list //získáme názvy všech sloupců, v tabulce jsou v 1 řádku, od 1. sloupce, chceme 1 řádek a všechny sloupce var columns = activeSheet.getRange(1, 1, 1, activeSheet.getLastColumn()).getValues()[0]; //Email (nepovinné) nahradím názvem vstupního pole, kde je email //Pokud uživatel nevyplnit svůj, email dosadíme ten náš if(e.namedValues["Email (nepovinné)"] != ""){ replyTo = e.namedValues["Email (nepovinné)"].toString(); }else{ replyTo = copy; } //pokud uživatel svůj email vyplnit, zobrazíme uživateli hlášku, že stačí dát Odpovědět if(replyTo != copy){ message += "<p>Uživatel vyplnit email, stačí dát odpovědět.</p>"; } message += "<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">"; //Všechny sloupce projdeme a získáme jejich název for ( var keys in columns ) { var key = columns[keys]; if ( e.namedValues[key] != "") { //pokud není otázka bez odpovědi, přidáme do výpisu message += "<tr><td align=\"right\">" + key + ' </td><td><strong>'+ e.namedValues[key] + "</strong></td></tr>"; } } message += "</table>" //Vytvoříme text pro email bez podpory HTML var textbody = message.replace(/<br>|<(\/)?p>|<tr>/gi, "\n");//nahradíme <br>, <p>,</p> a <tr> tagy koncem řádku textbody = textbody.replace(/<.*?>/gi, "");//ostatní HTML tagy vymažeme //Odešleme email příjemci, kopii sobě //Odesílatelé budeme vždy my, proto replyTo jako odpověď na jiný email GmailApp.sendEmail("prijemce@abc.cz", subject, textbody, {cc: copy, name: sendername, htmlBody: message , replyTo: replyTo}); //Uožíme si zprávu o odeslání Logger.log("Email odeslán"); } catch (e) { // v případě chyby také zalogujeme chybu Logger.log(e.toString()); } }
Automatické spouštění
Pokud jsme skript uložili, je potřeba nastavit spouštění funkce SendConfirmationMail při potvrzení formuláře. Klikněte na ikonku Current project's triggers a nastavte naši funkci při eventu onSubmit.
Po potvrzení musíte provést autorizaci skriptu. Bude mít totiž přístup do tvého emailu.
Opětovné ověření: Po pár letech mi přišel email, že je chyba ověření emailu. Skript se vůbec nezměnil, jen bylo potřeba jej otevřít a znovu spustit. Proběhla znova autorizace mého mailu a poté vše fungovalo. Je toto trochu limitující, ale co se dá dělat. Větru ani Google neporučíš.
Logger
V kódu jste si možná všimli použití třídy Logger, výpis logu můžete najít v menu View -> Logs a View->Execution transcript.
U vytváření triggeru lze také nastavit zasílání notifikací o chybách pod tlačítkem notifications.
Hotové skripty
Na dříve zmíněné stránce Labnol.net najdete mnoho již vytvořených skriptů. Na notifikaci o odpovědi jsem našel také, ale neposílaly konkrétní hodnoty. Tento skript, který jsem našel na Labnolu a upravil si dle svých potřeb však splnit přesně mé požadavky.
Na závěr screen emailu co mi přišel po mém testovacím vyplnění. (Klikni pro zvětšení)
Máš již zkušenosti s Google Skripty? Poděl se s námi o ně v komentářích
K tomuto článku již není možné přidávat další komentáře
Komentáře
Chtěl bych poděkovat panu Kutáčovi za skvělý návod a především skvěle upravený script.
Nejdříve jsem si jako zcela nový uživatel script editoru nebyl jistý, jestli mám text za // zanechat, jelikož mi nechtělo odesílání fungovat. Chyba nakonec byla ve špatně nahrazeném názvu pro sloupec s emailem respondenta. Takže pro ty, kteří jsou v tom nově jako já, z kódu se nic vymazávat nemusí ;)
Script jsem použil pro svůj registrační formulář hráčů na mou nově vznikající textovou hru. Funguje nádherně!
Ahoj, díky za skript. Loni mi běžel bez problémů, ale letos řeším, že při ladění se to zarazí na tomto řádku:
var columns = activeSheet.getRange(1, 1, 1, activeSheet.getLastColumn()).getValues()[0];
a v logu pak vidím:
[17-01-10 22:54:52:023 CET] Zahájení zpracování
[17-01-10 22:54:52:030 CET] SpreadsheetApp.getActiveSheet() [0 s]
[17-01-10 22:54:52:032 CET] Logger.log([TypeError: Nelze volat metodu „getRange“ z null., []]) [0 s]
Děkuji za rady,
Martin
Ahoj, musíš tam mít někde jinou chybu. Mě skript normálně funguje. Při ladění tedy spadne, protože parametr "e" funkce není při ladění definován, je to ale trochu později. Řádek, o kterém píšeš mi normálně projde, a emaily mi chodí.