GASとGoogleフォームとの連携方法

# はじめに
この記事は「[Ateam LifeDesign Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ateam-life-design)」で完走賞を狙って25記事書いているうちの7日目の記事です。今年も完走目指して頑張るぞ！

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

# 作るもの
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/30edb046-30b4-c4d6-faaa-02242c135699.png" width="300">

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

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

# GASを書いていく

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

![スクリーンショット 2023-11-25 21.42.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/3b773a1c-1b99-1293-c31f-839d995944ed.png)


```javascript
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/d23c6943-a80c-420d-683c-6c7da0fd2ead.png)

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

![スクリーンショット 2023-11-25 21.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/517b1266-1aef-1000-4d5f-78e484a9b39c.png)

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

![スクリーンショット 2023-11-25 21.53.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/5b6ded7a-6f9d-cff1-b5aa-2eefe1091de1.png)


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

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

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

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

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

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

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

# 完成品がこちら

## GASのコード

```javascript
function onFormSubmit(e) {
  var responses = e.response.getItemResponses(); // フォームの回答を取得
  var name = responses[0].getResponse();   // ０番目の回答には「名前」の内容が入っている
  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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/d113df95-05f9-f03a-655f-d1a3359d9558.png)

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

![スクリーンショット 2023-11-25 22.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/382c419b-ae6b-c4dc-aef2-b7737e4dcbfd.png)

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

![スクリーンショット 2023-11-25 22.34.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/8eef8808-37e2-1b88-cfce-325a82659a03.png)

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

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