以下の日程でご都合いかがでしょうかメーカーをGoogle Calenderと同期してみた


# 0. やりたいこと

@shoshirasaka さんの
「以下の日程でご都合いかがでしょうかメーカー （https://shirasaka.tv/11309） 」が超便利で、いつも使わせて頂いてます。
もっとさぼりたくなる衝動に駆られ、今回の記事になります。

予定調整するとき、
　カレンダーアプリで仮予定を押さえる　→　予定調整のやりとり　→　確定した予定をカレンダーに反映
のプロセスを踏むことが多く、私がつかっているGoogle Calenderと連携して、**仮予定タイトルを検索キーとして候補を挙げてくれたら、日付ポチポチする手間も省けるやん！ミスも減るやん！**
って思って作ってみました。

# 1. 仕様

ユーザは、
Google Formに検索キーを入れて送信すると、下記のような文章がメールで届くことになります。

```php:出力例
以下の日程でご都合いかがでしょうか。
01/08 (Fri) 11:00~11:45
01/15 (Fri) 11:00~11:45
01/29 (Fri) 11:00~11:45
```

仕組みとしては、
Google Apps ScriptでGoogle Calenderから

![図c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84320/bb54a3cb-6a56-93bf-050a-0f48a234c2f0.png)


# 2. 実装
## 2.1. Google Form作成

Google Formを新規作成。

1 . 回答形式を「記述式」とする
![図a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84320/13e681a8-8c56-3244-6f02-9e2b2a731b13.png)

2 . 設定→”メールアドレスを収集する”のチェックボックスをチェック

![図b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84320/05bc4cbd-eae9-a0f8-3912-57ad7410d35c.png)

3 . Google Apps Scriptを起動
　右上の送信ボタンの横の３つの点々→”スクリプトエディタ”


## 2.2. Google Apps Scriptの記述
下記が記述例になります。

補足：

* 実行日から31日先までの予定に限定しています。変えても構いません。 
* カレンダーの対象は、ユーザ自身のカレンダーのみ。
    * （自分が作成したものだけでなく招待されたものも対象となるっぽいです（当方の評価による。）
    * 参考：https://developers.google.com/apps-script/reference/calendar/calendar-app#getallownedcalendars）
* 送付メールアドレスは、Formで読み取るメールアドレスとしています。
    * （Formの質問を追加して、送付先を記載させる仕様でもいいですね）
* `//FormApp.getActiveForm();` はresponseプロパティが読み取れないエラーを回避するおまじない（参考：https://teratail.com/questions/158421）


```javascript:
//所有しているカレンダーを取得し、取得した検索キーに一致する時間を返す
//FormApp.getActiveForm();
function onFormSubmit(e) {
  //Google Formからの情報を受け取る
  var itemResponses = e.response.getItemResponses();
  var user = e.response.getRespondentEmail()
  var answer = itemResponses[0].getResponse();　　　//１個目の質問の回答
  var searchtext = answer
  
  var outtext = "以下の日程でご都合いかがでしょうか。" + "\n";

  var calendars = CalendarApp.getAllOwnedCalendars();   //自分が作成したカレンダーを取得  

  // 取得したカレンダー群から単体のcalenderを取得（calendersに対するループ処理）
  var startTime = new Date();
  var endTime = new Date(Date.parse(startTime) + (31 * 60 * 60 * 24 * 1000)); //開始日から31日間   
  var options = {
    search: searchtext
  }
  for(i in calendars) {
    var calendar = calendars[i]; // カレンダー単体
    var events = calendar.getEvents(startTime, endTime, options);

    // 取得したイベント群から単体のeventを取得
    for(j in events) {
      var event = events[j]; //イベント単体
      var date = Utilities.formatDate(event.getStartTime(), 'JST', "MM/dd (E)");    //日付と曜日
      var start = toTime(event.getStartTime());
      var end = toTime(event.getEndTime());

      outtext +=  date + " " + start + "~" + end + "\n";
    }
  }
//  Logger.log(outtext);
  sendtomail(outtext, user);

}

// 時間を24時間表記に変換するプログラム
function toTime(str){
  return Utilities.formatDate(str, 'JST', 'HH:mm');
}


function sendtomail(outtext, user) {
  var email = user;
  var subject = 'Form回答：日程調整文章';
  var body = outtext;
  GmailApp.sendEmail(email, subject, body);
}
```

## 2.3. Google Apps Scriptの起動トリガを設定

Google Apps Scriptエディタの上タグにあるタイマーから、
→　右下に出てくる”トリガーを追加” 
→ イベントの種類を”**フォーム送信時**”に変更、実行する関数は "**onFormSubmit**"に設定
（参考：ググると色々参考情報落ちております）

![図d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84320/9a2d624f-30fd-1281-1d57-8e2e5b954953.png)
![図e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84320/60d1f8c5-1bbe-5b80-1b89-314901922611.png)

## 2.4. 試してみる
フォームに回答してみて試してください。
Logger.logのログやエラーログがApps Scriptのダッシュボードから参照できます。
トリガー設定の画面から、右の３つの点々→"**実行数**"を選ぶと出てきます。
（参考：https://tonari-it.com/gas-console-log/）

# 3. さいごに

皆様の手元でちゃんと動くか自信はないですが、問題等あれば教えてください。
業務を効率化して他の作業に集中する時間を増やしたいですね。