LoginSignup
2
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-11-14

google formで日程を選択してもらって送信すると申し込んだ人のカレンダーに登録されるまでをやったのでメモしておきます。同じ内容の説明会を複数回実施、どれか1つに出席して欲しいパターンです。複数参加が可能なパターンは後半に追記しました。
image.png

専用のカレンダーを作って↑のgoogle formの選択肢と同じようにスケジュール登録しておきます。自分のカレンダーでも大丈夫だと思います。あとで日ごとにタイトル名で検索するので同じ日の予定は別名にしておく。
image.png

設定と共有へ行き下へスクロールしていくとカレンダーIDを確認できる。
image.png
image.png

google formに戻って、︙のマークから「スクリプトエディタ」を選択する。
image.png

このように作成しました。
image.png

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

//カレンダー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 = '説明会2'; //編集

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) //編集

}

 
時計マークみたいなところからプロジェクトを開きます。右下のほうにある「トリガーを追加」からトリガーを追加します。

イベントのソースを選択は「フォームから」
イベントの種類を選択は「フォーム送信時」を選択して保存。

許可を求められるので許可する。

スクリプトは直接実行すると失敗するが問題ない。
image.png
image.png

ファイル→表示→ログ をクリックする
image.png

ログを見るわけではなく「Apps Script ダッシュボード」に行きたかった。このダッシュボードで実行の結果が成功か失敗を確認できるので開いておく。
image.png

フォームの結果をスプレッドシートで得たいときはフォームの編集で「回答」へ行き、スプレッドシートのマークをクリックして作成しておく。(調べてみるとスプレッドシートに集まったデータから、googleカレンダーに登録する方法もあるみたい)

編集状態で右上にあるフォームの送信をクリックし、リンクを取得して実際にフォームに回答してテストします。
image.png

テスト中は何度も編集して送信するので「送信後に編集」をしておくと便利。
image.png

実際にフォームを送信して、先程の「Apps Script ダッシュボード」を確認する。失敗するときはコードにLogger.log(result)など書いて調査するとよいと思う。
image.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

oauthScopesを追加して、xxx部分に足りないと言われたhttps://~を全て追加する。
image.png

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

複数参加が可能な場合

異なる内容のセッションが開かれていてどれに参加してもいい場合はチェックボックスにしてコードを少し書き換える。

//カレンダー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)

}
2
7
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
2
7