LoginSignup
6
3

はじめに

この記事は「Ateam LifeDesign Advent Calendar 2023」で完走賞を狙って25記事書いているうちの7日目の記事です。今年も完走目指して頑張るぞ!

今日はGASとGoogleフォームの連携についてみていきます。

作るもの

こんなフォームがあったときに送信されて「回答」の項目に”重要”という単語を含んでいる場合のみ指定のアドレスにメールで通知を送るものを作っていきます。

Googleフォームの標準機能でもメールでの通知はあるのですが、「回答があった」ということしかわからないので少々不便です。メール自体に回答内容を記載したり、なにかの条件を満たす場合のみにメールを送るときなどはGASを使ってメール送信の処理を書くと良いです。

GASを書いていく

使いたいフォームを作ったら、「スクリプトエディタ」からGASを書くコンソールを開きます。

スクリーンショット 2023-11-25 21.42.19.png

function onFormSubmit(e) {
  // formがsubmitされたときの処理を書く
}

今回はこのようなメソッドを書いてこの中に処理を書いていきます。
ここで注意すべきなのがe.values() e.namedValues()を呼び出してフォームに記入された値を取ってこようとするとnullになってしまい取得ができないということです。トリガーで実行したイベントの引数eから回答内容を取得することができるのですが、このイベントの引数はトリガーの設定をGoogleフォームかスプレッドシートどちらで行っているかによって呼び出すメソッドが変わってきます。Googleフォームの場合はe.response.getItemResponses()で呼び出す必要があるので今回はこちらを使っていきます。

先にformがsubmitされたときにこの関数が呼び出されるようにトリガーの登録を行います。エディタの画面の左にある「トリガー」から「トリガーを追加」を選択します。

スクリーンショット 2023-11-25 21.52.07.png

先程作った関数を選択肢、それが「フォーム送信時」に実行されるようにして「保存」を押します。

スクリーンショット 2023-11-25 21.52.41.png

こんな画面が出てきたらトリガーの登録は完了です。
これでフォームが送信されたときにonFormSubmitの処理が動くようになりました。

スクリーンショット 2023-11-25 21.53.27.png

  var responses = e.response.getItemResponses(); // フォームの回答を取得
  var name = responses[0].getResponse();   // 0番目の回答には「名前」の内容が入っている
  var answer = responses[2].getResponse(); // 2番目の回答には「回答」の内容が入っている

  if (answer.includes('重要')) {
    sendImportantEmail(name);
  }

上述の通りフォームの回答内容はe.response.getItemResponsesで取得します。今回は回答内容が欲しかったのでgetResponseを呼び出していますがそれ以外にも以下のものが取得可能です。

メソッド名 内容
getItem().getTitle() 設問番号
getItem().getHelpText() タイトル
getItem().getIndex() 説明
getResponse() 回答内容

answer.includes('重要')で回答内容に「重要」という文字列が含まれる場合のみメール送信の処理を実行するようにしています。メール送信の処理はこちら。

function sendImportantEmail(name) {
  const email = 'example@example.com'; // メール送信先
  var subject = '重要な回答がありました';
  var message = name + 'さん。から重要な回答がありました。\n内容を確認してください';

  GmailApp.sendEmail(email, subject, message);
}

完成品がこちら

GASのコード

function onFormSubmit(e) {
  var responses = e.response.getItemResponses(); // フォームの回答を取得
  var name = responses[0].getResponse();   // 0番目の回答には「名前」の内容が入っている
  var answer = responses[2].getResponse(); // 2番目の回答には「回答」の内容が入っている

  if (answer.includes('重要')) {
    sendImportantEmail(name);
  }
}

function sendImportantEmail(name) {
  const email = 'example@example.com'; // メール送信先
  var subject = '重要な回答がありました';
  var message = name + 'さん。から重要な回答がありました。\n内容を確認してください';

  GmailApp.sendEmail(email, subject, message);
}

実行結果

重要という文字列を含む場合のみメールで通知することが出来ました!

スクリーンショット 2023-11-25 22.30.28.png

デバッグについて

今回のようにフォームから回答した値をe.response.getItemResponses()で呼び出している場合、スクリプトエディタから実行すると引数eがundefinedでエラーになります。そのため実際に回答しながらデバッグをしていく必要があるのですが、その場合はトリガーの設定ページから「実行数」を選択して

スクリーンショット 2023-11-25 22.33.39.png

実行結果の各行をクリックすることでLogger.logで仕込んだ内容や、エラーの内容を確認することが出来ます。

スクリーンショット 2023-11-25 22.34.13.png

少し面倒ですがこの方法でデバッグしながら実装していきましょう。

最後に

今日はGASからGoogleフォームの操作について触れてみました。簡単なサンプルですが実務においては結構活用場面が多そうですね!
明日はGmailとの連携についてみていきます。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3