Googleフォームからメールを自動返信する③ イベントオブジェクト

シリーズでアップしている「Googleフォームからメールを自動返信する」の第3回目となります。
①②がまだの方は、ぜひそちらの記事からご覧になってみてください。
Googleフォームからメールを自動返信する
Googleフォームからメールを自動返信する②

おさらいになりますが、フォームからメールを自動返信するプログラミングの構成としては、
① フォームから送信された回答情報を取得する
② 取得した情報を使ってメールを送信する
の2段階構成になっていました。

さて、その1段階目の回答情報の取得に関してですが、その取得方法は何通りかあって、1つしかないわけではありません。
シリーズ①では、スプレッドシートに保存された回答情報を、その記録されたセルから取得するという方法を使いました。
その時に使ったメソッドが、getRange( ).getValues( ) でした。

今回はこれとは異なる方法でフォームの回答情報を取得します。
それが、イベントオブジェクトです。

イベントオブジェクトとは

シンプルなトリガーとインストール可能なトリガーにより、特定のイベントが発生したときに、Apps Script によって自動的に関数が実行されます。トリガーが起動すると、Apps Script は引数としてイベント オブジェクト(通常は e という)を渡します。イベント オブジェクトには、トリガーを発動させたコンテキストに関する情報が含まれます。

公式リファレンスより

重要な点は、
① トリガーの起動とイベントの発生
② イベントオブジェクトにはイベント情報が含まれる
③ イベントオブジェクトが引数として関数に渡される
です。

イベントオブジェクトの変数名は何でもよいのですが、通常は「 e 」がよく使われます。
そして、この「 e 」の中に、フォームから送られたメールアドレスや名前や回答などの情報が含まれているということです。

イベントオブジェクトから情報を取得 e.values

基本的なコードは、シリーズ②のスクリプトをそのまま使えますので、まずそれをコピーします。
「コード.gs」ファイルの右の3点マークをクリックして、つづいて「コピーを作成」をクリックします。
コピーしたファイルに適当にファイル名を付けましょう。

コピーしたファイルの3〜9行目を削除します。

そして、下図のように書き改めます。
7行目の const email 以下のコードはそのまま使えます。
スクリプトを保存します。

sendThanksMail_2(e)関数名を変更して、引数に「e」を渡す
e.valuesイベントオブジェクトのvaluesプロパティ
valuesプロパティは、スプレッドシートと
同じ順序で値の配列を返す

完成コード

function sendThanksMail_2(e) {

  // フォーム送信時に回答情報をイベントオブジェクトで受け取る
  const values = e.values;

  // イベントオブジェクトから各情報を取り出して変数に代入
  const email = values[1];
  const name = values[2];
  const answer = values[3];

  // メール本文を作成して回答者に送信
  const title = '【イベント出欠確認】ご回答ありがとうございます';

  // 参加の場合の本文
  const yes_body = 
  `
  ${name} 様

  ご回答:${answer}

  上記のご回答を確認いたしました。
  ご参加いただけるとのこと、ありがとうございます。
  当日お目にかかれることを楽しみにしております。
  `;

  // 不参加の場合の本文
  const no_body = 
  `
  ${name} 様

  ご回答:${answer}

  上記のご回答を確認いたしました。
  今回はご参加いただけないとのことで残念です。
  次回のご参加をお待ちしております。
  `;

  // 参加か不参加で本文を条件分岐させる
  if (answer == 'はい、参加します') {
    MailApp.sendEmail(email, title, yes_body);
  } else {
    MailApp.sendEmail(email, title, no_body);
  }
}

トリガーの設定

トリガーの設定についてはこちらの記事を参考にしてください。
注意点は、実行する関数として「sendThanksMail_2」を間違いなく選択することです。

また、「sendThanksMail」でトリガーが先に設定されている場合は、そちらのトリガーは一旦削除してもよいかもしれません。
削除していない場合、成功した時にはたぶん同じメールが2通届くはずです。

フォームからテスト送信

では、フォームからテスト送信してみましょう。
回答を変えて、2通送信します。
イベントオブジェクトからちゃんと情報取得ができているでしょうか?
結果は….

無事、受信トレイにサンクスメールが届いています。
メールアドレス、お名前、「参加されますか?」の回答の各情報がイベントオブジェクトからちゃんと取得できています。
回答に沿った本文の条件分岐もできていることがわかります。

まとめ

今回のコードとシリーズ②のコード、結果としては同じ仕事をするコードです。
が、細かく見ると下のような違いがあります。

関数名情報取得のコード行数関数の処理速度
シリーズ②sendThanksMail4行1.084秒
今回sendThanksMail_21行0.371秒

GASにはスクリプトの実行制限がありますので、このことを頭の片隅に置いて処理方法を考える必要があります。

まずはコツコツと学び続け、さまざまな処理の仕方に触れて、学びの裾野を広げましょう。
あ、こんなコードの書き方もあるのか!という発見は、プログラミング学習の醍醐味です。

シリーズ目次:Googleフォームからメールを自動返信する

  1. Googleフォームからメールを自動返信する①
  2. Googleフォームからメールを自動返信する② 条件分岐
  3. Googleフォームからメールを自動返信する③ イベントオブジェクト

GASGフォーム

Posted by botw