Portál o technologiích a vývoji

Google Apps Script – Formulář s e-mailovým potvrzením registrace

Autor: Milan Kacálek Datum: 29.9.2013 Počet shlédnutí: 45 019 296x

Pokud organizujete nějaké akce, sbíráte e-maily do newsletteru, nebo jednoduše provádíte nějakou činnost, která vyžaduje potvrzování vložení (např. registrace) na e-mail, asi často litujete, že nástroj dostupný zdarma, Google Docs Forms, tuto funkci neumí.

Google Docs však disponují poměrné kvalitním skriptovacím jazykem, Google Apps Script. Tento skriptovací jazyk nám to umožní obejít. Hlavně nezapomeňte na skutečnost, že odesílaný e-mail se bude tvářit jako odeslaný z účtu pod kterým jste přihlášený v době tvorby formuláře.

Postup

1)  Vytvořit formulář.

  • Dotaz na e-mail by měl být povinný.

  • Provést ověření e-mailu Text -> E-mailová adresa

png;base64fa3d158bea522a0a

 

 

2) Jako cíl odpovědí zvolit tabulku.

  • Do tabulky přidat další sloupec pro potvrzení odeslání e-mailu.

png;base64acbd7c122808559b

 

3) Vytvoření skriptu pro odesílání e-mailu.

  1. V tabulce odpovědí kliknout na: Nástroje -> Editor skriptů…

  2. Vybrat: Prázdná projekt

  3. Projekt vhodně pojmenovat.

  4. Místo function myFunction() { … vložit následující skript.

 

var EMAIL_SENT       	= "E-mail odeslán";  // Confirmation e-mail sent
var SUBJECT          		= "Potvrzení vyplnění vtipu.";
var MESSAGE          		= "Ahoj, \npotvrzuji, že tvůj vtip byl uložen.";

var COL_EMAIL_ADRESS 	= 1;             // Column e-mail (indexed from 0)
var COL_EMAIL_SENT   	= 3;             // Column e-mail sent (indexed from 0)
var START_ROW        	= 1;             // First row of data to process (indexed from 0)
var LAST_COLUMNS     	= 3;             // Last columns of data to process (indexed from 0)
function SendGoogleForm(e) 
{  
  try 
  { 
    var startRow = START_ROW + 1;
    var lastColumns = LAST_COLUMNS + 1;

    var sheet = SpreadsheetApp.getActiveSheet();

    var lastRow = sheet.getMaxRows();

    for(lastRow; lastRow >= startRow; lastRow--)
      if(sheet.getRange(lastRow, 1).getValue() != "") {
        break;
      }

    if(lastRow >= startRow) {
      var dataRange = sheet.getRange(startRow, 1, lastRow - startRow + 1, lastColumns);
      var data = dataRange.getValues();
      for (var i = 0; i < data.length; i++) {
        var row = data[i];
        var emailAddress = row[COL_EMAIL_ADRESS];
        var emailSent = row[COL_EMAIL_SENT];

        if (emailSent != EMAIL_SENT) {
          var subject = SUBJECT;
          var message = MESSAGE;
          try {
            MailApp.sendEmail(emailAddress, subject, message);
            sheet.getRange(startRow + i, COL_EMAIL_SENT + 1).setValue(EMAIL_SENT);
          } catch(e) {
            sheet.getRange(startRow + i, COL_EMAIL_SENT + 1).setValue(EMAIL_SENT);
            Logger.log(e.toString());
          }
          SpreadsheetApp.flush();
        }
      }
    }    
  } catch (e) {
    Logger.log(e.toString());
  }    
}
  1. Podle potřeby nastavit příslušné proměnné:

    • EMAIL_SENT: text, který bude v tabulce potvrzovat odeslání e-mailu.

    • SUBJECT: Předmět odesílané zprávy.

    • MESSAGE: Zpráva odesílané zprávy.

    • COL_EMAIL_ADRESS: index sloupce do kterého se ukládá e-mail (indexováno od 0).

    • COL_EMAIL_SENT: index sloupce do kterého se ukládá potvrzení o odeslání e-mailu (indexuje od 0).

    • START_ROW: index řádku od kterého začínají data (indexuje od 0).

    • LAST_COLUMNS: index posledního sloupce, ve kterém jsou ještě data (indexuje od 0).

4) Nastavení spouštěče skriptu

  • Kliknout na tlačítko Spouštěč aktuálního projektu.

  • Neměl by být nastaven žádný spouštěč (pokud je tak vymazat).

  • Nastavit nový spouštěč na událost Z tabulky - Při odeslání formuláře.

png;base6424123a7a69780467

 

  • Uložit spouštěč.

  • Potvrdit autorizaci. E-mail bude chodit z mailu ze kterého potvrdíte tuto autorizaci.

5) A je to hotovo 🙂

Komentáře (8)

  • jan lehoučka

    26.11.2013 000 13:46

    > Reagovat

    Dobrý den,
    děkuji za informace/script. velice mi váš script pomohl.

    Ačkoliv nejsem programátor, byl jsem schopen dle vašeho precizního návodu implementovat.

    Mám ještě dotaz – prosbu, zda by šel script modifikovat tak, aby do potvrzovacího emailu vložil alespoň dvě pole z vyplňovaných polí ve formuláři – příklad :
    vyplnili jste tyto údaje:
    pole 1: zvolili jste termín 25.11.2013
    pole 2: vyhovuje mi čas: večerní hodiny

    Jak jsem psal již výše, nejsem programátor, tak vám moje prosba přijde úsměvná.

    Děkuji

    • Milan Kacálek

      26.11.2013 000 22:33

      > Reagovat

      Dobrý den/Ahoj,
      upravit script by měla být maličkost. Poupravím stávající příklad tak aby se v mailu posílal i zadaný vtip.

      1) Nejprve je potřeba přidat index sloupce ve kterém je hodnota, kterou chceme vložit do zprávy. To provedeme tak, že za 6 řádek (var COL_EMAIL_SENT = 3;) vložíme nový řádek, který bude vypadat takto: var COL_JOKE = 2; Dvojka tam je proto, že text vtipu se ukládá do třetího sloupce a protože se indexuje od 0 tak má třetí sloupce index 2.

      2) Dalším krokem je načtení vtipu. To se provede přidáním var joke = row[COL_JOKE]; za 30 řádek.

      3) A na konec načtený vtip připojíme k odesílané zprávě. Změníme řádek 35 (var message = MESSAGE;) na var message = MESSAGE + joke;

      Tak a je to hotovo. Snad jsem na nic nezapomněl.
      Ve vašem případě budete v prvním kroku přidávat indexy na dva sloupce a to ty které chcete aby byly zahrnuty do emailu (nezapomeňte na indexování od nuly).
      Ve druhém kroku budete přidávat také dva řádky kde místo joke zvolíte nějaký jiný vhodný název a místo COL_JOKE zadáte název indexu z prvního kroku.
      A ve třetím kroku sestavíte zprávu emailu. Proměnné s řetězci znaků se dají jednoduše spojovat znaménkem +.

      Kdyby byly další dotazy klidně se ptejte.

      • Láďa

        7.01.2014 000 15:00

        > Reagovat

        Dobrý den,
        mockrát děkuji za tento článek.
        Dělám pomocí Google formuláře něco jako inzeráty (prodej a nákup sport. oblečení a vybavení) pro známé, kteří vedou malý sportovní kroužek pro děti.
        Zajímala by mě možnost poslání potvrzovacího emailu (viz. výše) včetně odkazu na možnost pozdější změny odpovědí. Myšlenka je taková, že by tímto způsobem lídé sami později označili inzerát za neplatný(prodej byl uskutečněn). Vím, že po odeslání formuláře je možnost si link někam uložit, ale věřím, že to rodiče dělat nebudou a je pro ně i pohodlnější kliknout na odkaz v mailu, který jim přišel po vložení odpovědi/inzerátu.
        Dále nevím, jestli by šlo, aby ve formuláři byla možnost nahrát obrázek, který by se vložil do příslušného řádku v tabulce výsledků např. pomocí příkazu image.

        Děkuji
        Láďa

        • Milan Kacálek

          7.01.2014 000 15:07

          > Reagovat

          Dobrý den/ahoj,
          tak jestli máte nějaký takový link tak ho stačí vložit do toho emailu. Jestli žádná takový odkaz nemáte musel by jste nějaký vytvořit, nejlepší by byl asi apps skrip. Vložení obrázku asi nepůjde (nebo o tom nevím).
          Milan

  • Ponert

    24.09.2014 000 07:24

    > Reagovat

    Dobrý den,
    potřeboval bych zajistiti kontrolu, že daný uživatel již anketu vyplnil. Při otevření dotazníku podle identifikátoru v prvním políčku. Dá se to nějak zajistit přes spouštěč na začátku. Děkuji za zprávu.

    • Milan Kacálek

      25.09.2014 000 06:02

      > Reagovat

      Dobrý den,
      taková kontrola by určitě šla v tabulce s výsledky. Tam by se každý další řádek s odpovědí toho jednoho uživatele nějak označit. Ale abych řekl pravdu tak nevím zda by šlo zajistit i nějaká zpětná vazba pro uživatele přímo na formuláři (vždy to nějak jde, ale teď mě nenapadá jak to udělat).

  • Josef Novák

    23.10.2014 000 07:09

    > Reagovat

    Dobrý den, chtěl bych Vám poděkovat, protože mi Váš článek opravdu moc pomohl. Ještě bych se chtěl zeptat, jestli je možné nějak nastavit skript, aby mi vypisoval odpovědi z větveného formuláře do Excelu například na různých listů.

    Příklad:

    1) Rolovací seznam (ovoce, zelenina) když Ovoce, tak pokračovat strana 2. když Zelenina, str. 3
    2) Rolovací seznam (Jablko, Hruška, Švestka)
    3) Rolovací seznam (Celer, Mrkev, Květák)

    Výstup z Excelu vypadá takto:

    Ovoce Jablko
    Zelenina ——– Celer
    Zelenina ——– Mrkev
    Ovoce Hruška

    Šlo by to nějak nastavit, aby se mi druh té zeleniny vypsal hned do druhého sloupce? Nebo ještě lépe, aby mi ovoce šlo do listu 1 a zelenina do listu 2.

    Nevím jak moc to je složité a jestli je to alespon trochu možné, ale byl bych Vám moc vděčný za radu.

    Děkuji

  • Petr

    16.03.2015 000 15:15

    > Reagovat

    Dobry den,

    zkusil jsem pouzit Vas script, ktery by vyresil muj problem pri odpovedi registrovanych ucastniku seminare.

    Bohuzel mi script dava hlasku o chybe na redku 22

    A zadny email se nedodesle..

    Nemohl byste mi prosim s timto pomoci..?

    Dekuji ,

    Petr

    Moje tabulka ma sloupce A-J,

    kde ve sloupci E je emailova adresa (jestlize A je sloupec 0, pak E=4)
    a ve sloupci J, je ulozeno hlaseni o odeslani mailu, takze je to index sloupce 9

    Do scriptu jsem si podle Vaseho popisu pridal jeste to, aby se mi ke zvolene zprave pridaval jeste obsah bunky, kterou uzivatel pri registraci vyplni v teto bunce je uvedeno datum, na ktere se uzivatel prihlasuje.. Tento text s datem je ve sloupci H, coz je index 7

    Skript intenzivně používá metodu Range.getValue.Collapse
    File: Kód Line: 22
    Skript používá metodu, která je považována za náročnou. Každé vyvolání generuje časově náročné volání vzdáleného serveru. To může mít zásadní vliv na dobu provedení skriptu, zejména u velkých dat. Pokud skript způsobuje problémy s výkonem, měli byste zvážit použití jiné metody, např. Range.getValues().

    kdy radek 22 je v teto casti:

    21 for(lastRow; lastRow >= startRow; lastRow–)
    22 if(sheet.getRange(lastRow, 1).getValue() != „“) {
    23 break;
    24 }

  • Reagovat na komentář Zrušit odpověď na komentář

    Vaše e-mailová adresa nebude zveřejněna.