Google Calendarの空いている時間帯に予定を設定するツール


これは[Supership グループ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/supership)の16日目の記事です。

新卒2年目の@suzukitheseventhです！よろしくお願いします！
Qiita初投稿です！


今回は新卒1年目のときに作成した、
「予定を設定したいメンバを選ぶと、Google Calendarの予定の空いている時間帯とその時間帯に空いている会議室を探索し、予定を登録するツール」
について紹介いたします！

#目次
[1.前提環境](#1-前提環境)
[2.作成の背景](#2-作成の背景)
[3.コードの概要](#3-コードの概要)
[4.社内ツール化とその反響](#5-社内ツール化とその反響)
[5.最後に](#6-最後に)

#1. 前提環境
### 利用したもの
python3
Google Calendar api
django (今回の記事では範囲外)

### 会社のミーティングの管理体制

 - Google Calendarでミーティング(以下MTG)の予定が管理されている。
 - 会議室の予約もGoogle Calendarで管理されている。

### 準備
 - Google Calendar apiのtokenを取得してください。
 - [Google Calendar apiのquickstart](https://developers.google.com/calendar/quickstart/python)を参考にカレンダーの予定を取得できるようにしてください。
 - [Google Calendar apiで予定の挿入](https://developers.google.com/calendar/v3/reference/events/insert)※をできるようにしてください。

##### ※Tipps
Google Calendar apiのtokenのjsonファイルを取得したあとに、
quickstartのscriptを動かすと、token.pickleというファイルが作成されます。
このtoken.pickleファイル作成時にGoogleアカウントへ権限の許可が求められます。
quickstartのscriptをそのまま実行すると、CalendarへのRead権限しか要求されず、そのtokenを用いても予定挿入することができません。
そこで、
```SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']```
となっている部分の最後のreadonlyを削除して
```SCOPES = ['https://www.googleapis.com/auth/calendar']```
としてから実行しtoken.pickleを作成することで、CalendarへのWrite権限も要求され、予定挿入が可能となります。



#2. 作成の背景



私の部署では、新規配属されると既存のメンバ全員と1on1 (1対1の面談)が行われます。

そのため、
「新規配属者と既存メンバの空いている時間を見つけてGoogle Calendarの予定を設定する」 × 既存メンバの人数(当時は15名ほど)
という作業が発生します。

これを毎回手動で行うのが大変なので、APIを用いて自動化できないか？というのが、部署に配属されて最初のタスクでした。

ある程度動作するものが完成したある日、隣に座っていた方(他部署の非エンジニア)から雑談的に
「今どんなタスクをやっているんですか？」
と聞かれ、
「Google Calendarの空いている時間を見つけて、そこに予定を設定するやつ作ってます」
と答えて、(実際に他の人のCalendarにも反映されるかのテストも込みで)見せたところ、
「それめっちゃいいじゃないですか！使いたいです！」
と言われました。


「実際に完成したもの(jupyter notebook形式)」
「他部署の方からのニーズがあるということ」
「ぜひ他の人(非エンジニア)が利用できる形まで持っていきたいということ」
を部内に報告したところ、無事許可をもらうことができ開発をすすめることとなりました。

当初のscriptでは2名(1対1)のMTGしか対応していなかったこともあり、下記のいくつかの修正を行いました。

 - 複数人のMTGに対応可能に変更
 - 会議室の登録を可能に変更
 - py形式への変更

本記事では、これらの修正を行ったscriptに関して説明します。


#3. コードの概要

コードの流れは以下になります。
今回はAさん、Bさん、Cさんの3名でのMTGを設定することを想定しています。



###空いている時間帯探索
業務時間(10:00 ~ 19:00)を15分ずつに区切った、下記のようなdfを作成します。

|  time  |  value  |
| ---- | ---- |
|  10:00  |  0  |
|  10:15  |  0  |
|  10:30  |  0  |
|  ...  |  ...  |
|  18:30  |  0  |
|  18:45  |  0  |
|  19:00  |  0  |


###Google Calendar apiで予定の有る無しを判断

Aさんの各時間帯において、 [freebusy](https://developers.google.com/calendar/v3/reference/freebusy/query)というオプションを用いて予定の有る無しを判断します。
もし予定がある場合はdfの該当時間帯に+1します。
残りのBさん、Cさんも同様に、予定があったら該当時間帯に+1します。
会議室※に関しても、同様に予定があったら該当時間帯に+1します。

※なお、会議室のアドレスに関しては、[リソースのブラウジング]
(https://support.google.com/a/answer/60766)後に、「カレンダーの設定」に書かれた「カレンダーID」を用いました。


###予定の登録
valueが0だった時間帯に、Google Calendar apiの[Events: insert](https://developers.google.com/calendar/v3/reference/events/insert)により、予定を設定します。



###動作完了の告知
予定を設定した日時を表示します。
もし、空いている時間がなかった場合は空いていなかったということを表示します。





#4. 社内ツール化とその反響
### 社内ツール化
今回説明したscriptを本体として、djangoでwebアプリを作成し、社内ツールとしてリリースまで行いました。
余裕があったら、djangoで作成したwebアプリでのscript実行に関しても記事を書こうかなと思います。

社内ツールにしたときの実際の画面
![スクリーンショット 2020-11-11 19.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872691/58b60c17-477c-2e6b-fae3-b7b972673d41.png)



### 反響
これを社内にリリースしたのは2020年3月でした。
しかし、その頃には全社リモートワークとなっており、
実際に使われることはほとんどありませんでした(泣)

#5. 最後に

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
新卒1年目であっても「やりたい！」と手をあげれば実施させてもらえる会社です。
ご興味がある方は以下リンクよりご確認ください。
 【[Supership株式会社 採用サイト](https://supership.jp/recruit/)】
是非ともよろしくお願いします！