Googleフォームで日程を選択してもらって、Googleカレンダーに自動登録する

google formで日程を選択してもらって送信すると申し込んだ人のカレンダーに登録されるまでをやったのでメモしておきます。同じ内容の説明会を複数回実施、どれか1つに出席して欲しいパターンです。複数参加が可能なパターンは後半に追記しました。
<img alt="image.png" width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/d8bc675d-01c6-e7b9-fc38-d0950c3eb138.png">


専用のカレンダーを作って↑のgoogle formの選択肢と同じようにスケジュール登録しておきます。自分のカレンダーでも大丈夫だと思います。あとで日ごとにタイトル名で検索するので同じ日の予定は別名にしておく。
<img alt="image.png" width="430" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/cea3e75f-fdd7-3415-8975-9d45235b3c49.png">

設定と共有へ行き下へスクロールしていくとカレンダーIDを確認できる。
<img alt="image.png" width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/376733ea-3cd5-34ad-cacf-4a508a3486db.png">
<img alt="image.png" width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/b6367de1-645e-3035-ec59-284867c2527f.png">



google formに戻って、︙のマークから「スクリプトエディタ」を選択する。
<img alt="image.png" width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/16000618-9371-7dd8-4199-adbea13cea03.png">


このように作成しました。
<img alt="image.png" width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/8c36dbbc-bf2c-1c0a-0904-4c36f1b90a63.png">

コピペ用です。//編集 を追加したところがそれぞれの環境で編集が必要なところです。

```js
//カレンダーID
var CAL_ID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com'; //編集

//日付とイベントタイトル
var CAL_EVENT_DATE1 = '2020/11/16'; //編集
var CAL_EVENT_DATE2 = '2020/11/17'; //編集
var CAL_EVENT_DATE3 = '2020/11/18'; //編集
var CAL_EVENT_TITLE1 = '説明会'; //編集
var CAL_EVENT_TITLE2 = '説明会２'; //編集

function myFunction(e) {
   function addCalendar(date, title) {
     // Form申し込みした人のアドレスを取得
     var address = e.response.getRespondentEmail();
    
     //カレンダーにユーザー追加
     var cal = CalendarApp.getCalendarById(CAL_ID);
     var events = cal.getEventsForDay(new Date(date), {
     search: title,
     });
     var event = events[0];
     event.addGuest(address);
   }

  var items = e.response.getItemResponses();
  var result = [];
  for (var i = 0; i < items.length; i++) {
    var item = items[i];
    var question = item.getItem().getTitle();
    var answer = item.getResponse();
    result.push([question, answer]);
  }
  
  if (result[0][1] == '11月16日(月) 10時～11時' )  //編集
    addCalendar(CAL_EVENT_DATE1,CAL_EVENT_TITLE1) //編集
  if (result[0][1] == '11月17日(火) 11時～12時' )  //編集
    addCalendar(CAL_EVENT_DATE2,CAL_EVENT_TITLE1) //編集
  if (result[0][1] == '11月18日(水) 10時～11時' )  //編集
    addCalendar(CAL_EVENT_DATE3,CAL_EVENT_TITLE1) //編集
  if (result[0][1] == '11月18日(水) 13時～14時' )  //編集
    addCalendar(CAL_EVENT_DATE3,CAL_EVENT_TITLE2) //編集

}

```



　
時計マークみたいなところからプロジェクトを開きます。右下のほうにある「トリガーを追加」からトリガーを追加します。
<img width="310" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/82409763-0904-afd6-80bb-1f22206c0aa5.png">
<img width="590" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/99b151bd-7dcc-acb8-b8a3-73dc5f1cba32.png">



イベントのソースを選択は「フォームから」
イベントの種類を選択は「フォーム送信時」を選択して保存。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/ff0a9bb0-9ef7-dddc-4720-da85433ef950.png">


許可を求められるので許可する。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/273913c2-d183-e77c-7777-63a0a7a9c440.png">



スクリプトは直接実行すると失敗するが問題ない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/fa88d561-5d20-9b85-0e0f-eb22ca9edd26.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/03499ebd-3f09-861a-6fda-15140cad0d6a.png)


ファイル→表示→ログ　をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/3719133e-cd62-6ead-0335-90fc635ce197.png)

ログを見るわけではなく「Apps Script ダッシュボード」に行きたかった。このダッシュボードで実行の結果が成功か失敗を確認できるので開いておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/ddd732a2-b66c-4f61-bad0-52801b02901f.png)



フォームの結果をスプレッドシートで得たいときはフォームの編集で「回答」へ行き、スプレッドシートのマークをクリックして作成しておく。（調べてみるとスプレッドシートに集まったデータから、googleカレンダーに登録する方法もあるみたい）
<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/6885f98a-f31a-d972-bb28-0887fe01705c.png">

編集状態で右上にあるフォームの送信をクリックし、リンクを取得して実際にフォームに回答してテストします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/aab4ce26-af3f-6779-7c0a-d0ca07eb0219.png)

<img width="380" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/506901d1-7ab2-c23b-2fd7-24e65363d278.png">

テスト中は何度も編集して送信するので「送信後に編集」をしておくと便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/aebf89ce-617b-9ef2-4e70-dea2fb3c8e9e.png)

実際にフォームを送信して、先程の「Apps Script ダッシュボード」を確認する。失敗するときはコードにLogger.log(result)など書いて調査するとよいと思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/084576c9-cfca-795b-4769-bf1c8aac5677.png)


カレンダーに実際に登録されることをいろんなパターンで確認して終わり。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/9c36d429-597c-4c29-cbfd-8cf308c873a8.png">


#こちらを参考にしました。
https://qiita.com/mfykmn/items/5709b3186bfc506605f6
https://www.pre-practice.net/2017/11/google-form_11.html

-------
# その他
### うまく行かないときはLogger.log()を使って確認する。
Logger.log(result)を確認するとこんな感じ。
```[[参加する日程を選んで送信してください, 11月17日(火) 15時～16時], [事前の質問, あああ]]```
result[0][1]で日時の部分が取れてるかどうか確認する。


### 権限エラーがでるとき
```
権限エラー
Exception: スクリプトにはその操作を行う権限がありません。その操作を行うには
「(https://www.googleapis.com/auth/calendar || 
    https://www.googleapis.com/auth/calendar.readonly || 
    https://www.google.com/calendar/feeds)」権限が必要です。
```

表示から「マニフェストファイルを表示」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/72ac7c01-6260-f559-1732-6a6082a54fa0.png)

oauthScopesを追加して、xxx部分に足りないと言われたhttps://～を全て追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/88768685-9a93-05c3-0c80-fbfadbc1dc3a.png)

ファイル→プロジェクトのプロパティ→スコープに追加したものがあるか確認する。
コードにあとから何か追加とかしてなければ基本は起きないはず。。



### 複数参加が可能な場合
異なる内容のセッションが開かれていてどれに参加してもいい場合はチェックボックスにしてコードを少し書き換える。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/78bfb97c-8558-2607-b2b1-76a4eef7318e.png">


```javascript
//カレンダーID
（省略）
  
  //32行目以降あたりに追加。
  result = result[0][1] 
  
  //ログに出して確認
  Logger.log(result) //[11月16日(月) 10時～11時, 11月17日(火) 11時～12時, 11月18日(水) 10時～11時, 11月18日(水) 13時～14時]
  Logger.log(result[0]) //11月16日(月) 10時～11時
  Logger.log(result[1]) //11月17日(火) 11時～12時
  Logger.log(result[2]) //11月18日(水) 10時～11時
  Logger.log(result[3]) //11月18日(水) 13時～14時
  
  //result[x]に書き換える
  if (result[0] == '11月16日(月) 10時～11時' )
    addCalendar(CAL_EVENT_DATE1,CAL_EVENT_TITLE1)
  if (result[1] == '11月17日(火) 11時～12時' )
    addCalendar(CAL_EVENT_DATE2,CAL_EVENT_TITLE1)
  if (result[2] == '11月18日(水) 10時～11時' )
    addCalendar(CAL_EVENT_DATE3,CAL_EVENT_TITLE1)
  if (result[3] == '11月18日(水) 13時～14時' )
    addCalendar(CAL_EVENT_DATE3,CAL_EVENT_TITLE2)

}
```