Googleフォームで理解度テストを実施して、その結果をメールで連絡する仕組みをGASで作ってみた

##やりたいこと

Googleフォームで理解度テスト（的なもの）を行い、その結果（合格/不合格）をメールで連絡する仕組みをGASで作ってみようと思います。
まずGoogleフォームを作ります。

##Googleフォームの作成
シンプルにこんなフォームを作りました。

```
メールアドレス入力
質問1: ラジオボタン（選択肢 1 / 選択肢2）
質問2: ラジオボタン（選択肢 1 / 選択肢2）
質問3: ラジオボタン（選択肢 1 / 選択肢2）
```

![スクリーンショット 2021-12-20 15.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114743/e643e19f-23aa-a85e-9cb9-5e05bd939576.png)

##フォームのGASを作成

次に右上の送信ボタン右の縦に並んだ `・・・` ボタン（ ~~なんて名前なんだろう~~ ケバブメニューらしい。Twitterで教えていただきありがとうございました！:relaxed:）をクリックしその中の `スクリプトエディタ` をクリックしてGASを書いていきます。

###フォームの値を取得
まずGASでフォームの内容を取得してみましょう。

```js:コード.gs
function getFormData(e) {
  const email = e.response.getItemResponses()[0].getResponse();
  const q1 = e.response.getItemResponses()[1].getResponse();
  const q2 = e.response.getItemResponses()[2].getResponse();
  const q3 = e.response.getItemResponses()[3].getResponse();

  console.log(email);
  console.log(q1);
  console.log(q2);
  console.log(q3);
}
```

これでGASでGoogleフォームの送信内容を取得できます。
次にGoogleフォームとGASを繋げます。

###トリガーを設定
Googleフォーム送信でGASを実行させるようにトリガーを設定します。
画面左のトリガーボタン（時計アイコン）をクリックし、トリガー画面で `トリガーを追加` ボタンをクリックします。

|![スクリーンショット 2021-12-20 18.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114743/479482e8-6efe-2b23-d0df-ba28bdb52b42.png)|
|:--|

下のスクショの `トリガーを追加` モーダルが開いたら `イベントの種類を選択` を `フォーム送信時` にし `保存` ボタンをクリックします。
これによりフォームを送信したときに `実行する関数を選択` で選択した関数（=getFormData）が実行されるようになります。
初めての際にアクセス許可が出てくるので許可しておきます。

![スクリーンショット 2021-12-20 18.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114743/cb6fa93f-3212-2736-de3c-5ebc55b3b11b.png)

これでGoogleフォームとGASが繋がったのでフォーム送信を試してみましょう。
GASで書いた `console.log` の結果は以下で確認できます。
トリガーを設定したように画面左の実行数ボタン（リスト？アイコン）をクリックし、実行数画面で青い帯エリアをクリックします。
すると `Cloud のログ` としてconsole.logの結果が表示されます。
すぐは反映されないので、ログが表示されないときは少し待ってから更新してみてください。

|![スクリーンショット 2021-12-20 19.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114743/76403daf-fa0d-5dbf-c9c0-4a76fb8f7d41.png)|
|:--|

##フォーム内容を判定する
次に送られたフォーム内容の判定をしてみましょう。
ここではGoogleフォームで `選択肢 1` が選択されたら正解ということにします。

```js:コード.js
function judgement(q1, q2, q3) {
  if('選択肢 1' == q1) {
    console.log('質問1 正解！');
  }
  if('選択肢 1' == q2) {
    console.log('質問2 正解！');
  }
  if('選択肢 1' == q3) {
    console.log('質問3 正解！');
  }
}
```

判定する関数judgement(q1, q2,q3)を書いたのでgetFormData(e)から呼び出すようにします。
ついでにconsole.logでの確認は不要なので削除します。

```js:コード.js
function getFormData(e) {
  const email = e.response.getItemResponses()[0].getResponse();
  const q1 = e.response.getItemResponses()[1].getResponse();
  const q2 = e.response.getItemResponses()[2].getResponse();
  const q3 = e.response.getItemResponses()[3].getResponse();
  judgement(q1, q2, q3)
}
```
ではGoogleフォームから送信して試してみましょう。

###正解数を数える
うまくログが出ましたでしょうか？
うまくいったら、console.logでログ出力する代わりに正解数を数えるようにしてみます。

```js:コード.js
function judgement(q1, q2, q3) {
  // 正解数
  let score = 0;
  // 判定
  if('選択肢 1' == q1) {
    score += 1;
  }
  if('選択肢 1' == q2) {
    score += 1;
  }
  if('選択肢 1' == q3) {
    score += 1;
  }
  // 結果をログ出力
  console.log(score);
}
```

またGoogleフォームから送信テストをしてみます。ログに正解数が出ましたね！

###正解数からメール用のメッセージを作る
次に正解数の代わりにメール用の文面をログ出力するようにしましょう。

```js:コード.js
function judgement(q1, q2, q3) {
  // 正解数
  let score = 0;
  // 判定
  if('選択肢 1' == q1) {
    score += 1;
  }
  if('選択肢 1' == q2) {
    score += 1;
  }
  if('選択肢 1' == q3) {
    score += 1;
  }
  
  // メール用メッセージ
  let message = '';
  // 判定
  if(2 <= score) {
    message = '合格です！';
  } else {
    message = '不合格です..';
  }
  
  // 結果をログ出力
  console.log(message);
}
```

うまくログにメッセージが出たら、今度は作ったメッセージをgetFormData(e)に返すようにしましょう。

```js:コード.js
function getFormData(e) {
  const email = e.response.getItemResponses()[0].getResponse();
  const q1 = e.response.getItemResponses()[1].getResponse();
  const q2 = e.response.getItemResponses()[2].getResponse();
  const q3 = e.response.getItemResponses()[3].getResponse();
  const message = judgement(q1, q2, q3)

  console.log(message);
}

function judgement(q1, q2, q3) {
  // 正解数
  let score = 0;
  // 判定
  if('選択肢 1' == q1) {
    score += 1;
  }
  if('選択肢 1' == q2) {
    score += 1;
  }
  if('選択肢 1' == q3) {
    score += 1;
  }
  
  // メール用メッセージ
  let message = '';
  // 判定
  if(2 <= score) {
    message = '合格です！';
  } else {
    message = '不合格です..';
  }
  
  // 結果を返す
  return message
}
```

getFormData(e)のconsole.logでも正しくメッセージが出たらOKです。

##メール送信する
これでgetFormData(e)にメールアドレスとメール用メッセージが揃いました。
あとは固定のメールタイトルを作って、メール送信してみましょう。
メール送信は `GmailApp.sendEmail(対象メールアドレス, メール件名, メール内容)` を実行するだけです。簡単 :relaxed:
ただ一つ注意があります！
今回初めて `GmailApp` が出てきたため、GmailAppの権限を与えないと以下のエラーが発生します。
`Exception: スクリプトにはその操作を行う権限がありません。`
権限を与えるためには既存のトリガーを編集で開き保存します。（ `トリガーを編集` モーダルで何も変更しないまま `保存` ボタンクリックでOKです。）
すると保存ボタンクリック後にアクセス許可が出るので許可します。

```js:コード.js
function getFormData(e) {
  const email = e.response.getItemResponses()[0].getResponse();
  const q1 = e.response.getItemResponses()[1].getResponse();
  const q2 = e.response.getItemResponses()[2].getResponse();
  const q3 = e.response.getItemResponses()[3].getResponse();
  const message = judgement(q1, q2, q3)
  const mailTitle = '結果通知';

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

これでメールが送信されるはずです。試してみましょう！:incoming_envelope:

##まとめ
全部のGASはこんな感じ。

```js:コード.js
function getFormData(e) {
  const email = e.response.getItemResponses()[0].getResponse();
  const q1 = e.response.getItemResponses()[1].getResponse();
  const q2 = e.response.getItemResponses()[2].getResponse();
  const q3 = e.response.getItemResponses()[3].getResponse();
  const message = judgement(q1, q2, q3)
  const mailTitle = '結果通知';

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

function judgement(q1, q2, q3) {
  // 正解数
  let score = 0;
  // 判定
  if('選択肢 1' == q1) {
    score += 1;
  }
  if('選択肢 1' == q2) {
    score += 1;
  }
  if('選択肢 1' == q3) {
    score += 1;
  }
  
  // メール用メッセージ
  let message = '';
  // 判定
  if(2 <= score) {
    message = '合格です！';
  } else {
    message = '不合格です..';
  }
  
  // 結果を返す
  return message
}
```

ただこのままだと正解の解答や合格判定ラインがコードに埋まっていて変更がめんどくさいので、次回スプレッドシート上で編集できるように改造してみます。
書きました。[続：Googleフォームで理解度テストを実施して、その結果をメールで連絡する仕組みをGASで作ってみた](https://qiita.com/taketch/items/5fb4cec1dd4d53976c11)
お疲れ様でした :robot::zzz: