Odeslání výsledku formuláře - Google Scripts

Pavel Tipy & triky, JavaScript, Google

Google ve své online kanceláři Google Drive přidal novinku v podobě vlastních skriptů. Dnes si ukážeme, jak využít připravené API k odeslání výsledků formuláře po jeho vyplnění na email.

Odeslání výsledku formuláře - Google Scripts

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

Nastavení triggerů

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

Ukázka odpovědi


Máš již zkušenosti s Google Skripty? Poděl se s námi o ně v komentářích

Přidat komentář

Právě odpovídáte na existující komentář. Zrušit

Komentáře

Lucas

http://the-last-witch-hunter.blog.cz 30.10.2015 15:32

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ě!

Odpovědět

Martin Lanc

10.1.2017 23:00

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

Odpovědět

Pavel

http://www.kutac.cz/blog/ 10.1.2017 23:43

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

Novinky z blogu

Do Hyundai na interní prohlídku

Jak jsme zavítali do fabriky Hyundai Dymos v Nošovicích na jednu interní exkurzi. Absolvovali bezpečnostním školením, prošli si výrobní halu a také mohli zkusit vyrobit...

Další články