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

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

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ář

Položky označené * jsou povinné. Email nebude zveřejněn

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