女の子クラブのGoogleカレンダーをhackして特定のキャストのGoogleカレンダーを作成する

# はじめに
最近、**女装していることを隠そうともしなくなった**星咲ひかる（@hkak03key）ですこんにちは。
髪の毛めっちゃ伸びまくってるししょうがないですね。伸ばしてるんですけどね。
てか、**エンジニアやるより可愛いを作るほうが数百倍は楽しい**んですよね。
もうS3とかIAMとか見たくない。
というわけで、みんなも**[ガーリー系コーデ](https://twitter.com/hkak03key/lists/girly)**やろう！！！！

**閑話休題。**

女装界隈には色々なお店がありますが、その中のひとつに女の子クラブ（ http://girls-club.jp ）というお店が新宿にあります。
手ぶらで行ってもお店にあるメイク道具とお洋服で女装できるし、**可愛い&綺麗な女装キャストさんにメイクをやってもらうこともできる**という素敵なお店です（宣伝）。
**「女装したいけど一歩が踏み出せない」**という方は星咲と一緒に行こうね！！！


さて、星咲さんはそんな女の子クラブにほぼ<ruby>毎週末居る<rp>（</rp><rt>暇人</rt><rp>）</rp></ruby>わけなんですが、そうなると当然「今日誰が出勤するんだっけ？」っていう情報が欲しくなります。
で、そんな人達のために（というわけではないですが）**出勤表がGoogleカレンダーで公開されています。**

* 女の子クラブ新宿本店: https://calendar.google.com/calendar/embed?src=tu2ifgf3043tbom79e9d6fhl60%40group.calendar.google.com&ctz=Asia%2FTokyo
* 女の子クラブ御徒町店: https://calendar.google.com/calendar/embed?src=5j8ph2kec1lv31ho9hhq3t3ilk%40group.calendar.google.com&ctz=Asia%2FTokyo
* フリーメゾン: https://calendar.google.com/calendar/embed?src=pit8ljsl9gpd1bj6b4gm86etq0%40group.calendar.google.com&ctz=Asia%2FTokyo

**当然**、自分のGoogleカレンダーに登録するわけですが、**このカレンダーは出勤するキャスト全員が載っているため情報量が多いという問題**があります。

そこで、**特定のキャストの情報を収集しそのキャスト専用のGoogleカレンダーを作成する**ことにしました。

前置きが長くなりましたが、本記事では、**GoogleAppsScript（以下GAS）を利用してGoogleカレンダーの情報を定期的に取得・編集を行う方法**について簡単に説明します。

**悪用厳禁。**

## この記事を読むことで理解できそうなこと

* GASをGoogleスプレッドシート経由ではない方法で作成する方法
* GASを利用しGoogleカレンダーを操作する方法の触り
* GASを定期実行する方法

## コードだけ読みたい人へ
GoogleカレンダーとかGASプロジェクトとかの細かい設定の説明は要らないからコードだけ読みたいという人は、**[こちらのgist（リンク）](https://gist.github.com/hkak03key/fb41edeac6a71888e0066af776fef29d)**を参照してください。

# 要件
## システム要件
何を実現したいか、です。

- 対象となるキャストがどこの店舗に出勤するかを自動で取得し、こちらで用意したGoogleカレンダーに対して更新する
    - 新たに出勤になった場合だけでなく、出勤->欠勤などにも対応する
    - このとき、差分を取得するのが望ましいが、めんどくさいのでとりあえず2週間先（決め打ち）の情報まで取得し更新する

## 技術要件
使う技術の要件です。こちらは僕の都合ですが。

- 速攻で作れる
- 定期実行できる
- 運用コスト0円
- Googleのサービスと親和性が良い

...というわけで、GASを利用することにしました。
JS系は得意ではないですが、とりあえず走るものはできるかなと。

# 手順
今回は、女の子クラブのキャストのひとりである**ほたてちゃんのカレンダー**を作ってみましょう。
ちなみに、完成したカレンダーは**[こちら（リンク）](https://calendar.google.com/calendar/embed?src=go1v09pqgsfc586u5ugeco97j4%40group.calendar.google.com&ctz=Asia%2FTokyo)**。

## googleカレンダーを作成・設定する
### カレンダーの作成
まず、以下のリンクから、googleカレンダーを作成します。
https://calendar.google.com/calendar/r/settings/createcalendar

名前と説明は後で変更できるので、適宜設定しましょう。
今回は、名前を「ほたて@女の子クラブ」とします。

### カレンダーの情報取得と設定
カレンダーを作成すると「メインメニュー」の「マイカレンダー」に登録されます。
作成したカレンダーのオーバーフローメニューから「設定と共有」を選択します。

<img width="398" alt="スクリーンショット 2019-11-12 19.03.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223584/a67496cb-9525-a822-5974-5ec6121afb1f.png">

#### カレンダーIDの取得
GASで「カレンダーID」を利用するので、控えておきましょう。
今回は`go1v09pqgsfc586u5ugeco97j4@group.calendar.google.com`という値でした。
<img width="653" alt="スクリーンショット 2019-11-13 10.56.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223584/6e99679f-3467-ed4b-8f37-9d60bb023c54.png">


##### 注意
手元で試しに実行したい場合、対象のカレンダーは書き込み権を所有するカレンダーである必要があるため**このサンプル値は利用できません。**
お手数ですがご自分のアカウントでカレンダーを作成し、カレンダーIDを取得してください。

#### (option)公開設定とリンクの取得
アクセス権限の設定を変更し、一般公開します。
また、「共有可能なリンクを取得」ボタンをクリックし、リンクを取得します。
<img width="733" alt="スクリーンショット 2019-11-12 19.06.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223584/dafa3f6b-131e-521c-fa26-ba7f00678eec.png">


## プロジェクトを作成・編集する
### プロジェクトの作成
以下のリンクにアクセスし「新しいプロジェクト」を選択すると、プロジェクトの編集画面へ遷移します。
https://script.google.com/home

<img width="475" alt="スクリーンショット 2019-11-13 10.58.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223584/5afe1217-21ee-7ab0-941e-321cbdefc1c8.png">


プロジェクトの編集画面へ遷移したら「ファイル」->「名前の変更」と選択し、プロジェクト名を適当に設定してください。

星咲は、このスクリプトを書く前までは**GASは必ずGoogleスプレッドシートと関連付けなければ作成できないと思っていた**んですが、こういう方法でスタンドアロンなGASを作成できるんですね。

### コーディング
やりたいことをGASで書いていきます。
ここでは**3分クッキングにしたい**ので、**[こちらのgist（リンク）](https://gist.github.com/hkak03key/fb41edeac6a71888e0066af776fef29d)**にある`code.gs`のコードをコピペし、`PLEASE_SET_GOOGLE_CALENDAR_ID`を先程取得したカレンダーIDに置き換え、保存します。

GASを用いたGoogleカレンダーの操作方法については、僕のコードと[リファレンス（リンク）](https://developers.google.com/apps-script/reference/calendar)を参照してください。

#### コードのざっくりとした戦略解説
女の子クラブ側のカレンダーについては、**全日の予定のタイトルにキャスト名が入力されている**ので、キャスト名で検索すれば扱えます。
また、出勤時間が書いてある場合がありますが、そいつは正規表現でキャプチャして出力先のカレンダーのタイトルに突っ込むことにしました。
あとは、更新先のカレンダーとの差異を発見し更新すればミッションコンプリートということになります。

### 初回実行とアクセスの許可
「実行」->「関数の実行」->「main」と選択するとスクリプトが実行されます。

ここで、初回実行時にはAuthorization requiredのポップアップが出るので、「許可を確認」ボタンを選択します。
<img width="651" alt="スクリーンショット 2019-11-13 11.03.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223584/f5ad1dfb-a5f9-5ce0-800f-1477b48a1f7c.png">


アカウントの選択画面に遷移するので、編集したいGoogleカレンダーの編集権限を持つアカウントを選択します。

すると、「このアプリは確認されていません」という怖そうなメッセージの画面に遷移しますが、要は「Googleはこのアプリがどのようなものか確認してないから実行は自己責任でよろしく」という意味なので、気にせずに進めましょう。
「詳細」リンクを選択し、「{GASプロジェクト名}（安全ではないページ）に移動」リンクを選択します。

<img width="678" alt="スクリーンショット 2019-11-13 11.05.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223584/dc55a6be-7a6c-9718-64e8-9a294338eb1e.png">

最後にGASからの認可要求画面が出るので、問題ないことを確認し「許可」を選択すると実行されます。
<img width="470" alt="スクリーンショット 2019-11-13 11.10.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223584/60e70e74-781a-722e-4531-6c78d3541799.png">

正常に実行されれば、Googleカレンダーに今日以降のほたてちゃんの出勤情報が入力されます。
こんな感じ。
<img width="690" alt="スクリーンショット 2019-11-13 13.53.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223584/4b286c0b-3917-627e-9566-88e946e49de0.png">

### 定期実行の設定
定期実行のためのトリガを設定します。
「編集」->「現在のプロジェクトのトリガー」を選択すると、現在のプロジェクトのトリガー一覧のページへ遷移します。
現在のプロジェクトのトリガー一覧のページへ遷移したら、右下にある「トリガーを追加」を選択します。
<img width="245" alt="スクリーンショット 2019-11-13 13.58.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223584/436d9508-7915-45e0-6659-efa7a843cb07.png">

各項目を設定します。
イベントのソースを「時間主導型」にすることで定期実行が可能になります。
<img width="758" alt="スクリーンショット 2019-11-13 14.00.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223584/224721af-8a2d-a93d-75dd-a607ef6b14c4.png">

設定が完了したら「保存」を選択します。

### 完成
以上で完成です。今回完成したカレンダーは**[こちら（リンク）](https://calendar.google.com/calendar/embed?src=go1v09pqgsfc586u5ugeco97j4%40group.calendar.google.com&ctz=Asia%2FTokyo)**になります。
お疲れ様でした。

### 余談
code.gsについて、以下のようにすることで複数のキャストさんのカレンダーを同時に更新させることができます。

```
  var cals_target = {
    "ほたて": CalendarApp.getCalendarById(GOOGLE_CALENDAR_ID_HOTATE),
    "ひより": CalendarApp.getCalendarById(GOOGLE_CALENDAR_ID_HIYORI)
  };
```


# 終わりに
GASを利用することで、Googleカレンダーをかなり簡単に操作でき、定期実行ができることを示しました。
**「JSベースじゃなければなぁ...」という個人的な想いがとてもありますが、**一つの手段として持っておくのは損では無いと思います。
実行時間の制限はありますが**無料で定期実行できますし。**

また、以下の記事のようにイベントの差分を取得する方法もあります。
[GASにGoogleカレンダーのイベント変更検知機能が実装されたので試してみた（リンク）](https://qiita.com/howdy39/items/b92c9ba0b050151a889b)
この実装のほうがエレガントですよね。

あるいは、世の中には[Zapier](https://zapier.com/)などのサービス間連携のための便利SaaSも転がっていますので、適用可能であればそのようなサービスを利用するのも大いにありだと思います（今回は適用不可でした）。

というわけで、**良い女装&Googleライフを！**

## 追記
本人公認カレンダーになりました(((
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">エンジニアのひかるちゃん<a href="https://twitter.com/hkak03key?ref_src=twsrc%5Etfw">@hkak03key</a><br>が女の子クラブのgoogleカレンダーをhackして私の出勤表つくってくれました。🥰<a href="https://t.co/KYIkALdzZO">https://t.co/KYIkALdzZO</a><br><br>めちゃ便利だょ～<br>みんなブックマークしろよ～‼️😺</p>&mdash; ほたて☆フェイにゃん (@fainyan) <a href="https://twitter.com/fainyan/status/1195076486820028416?ref_src=twsrc%5Etfw">November 14, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

「何らかの原因でカレンダーが反映されず出勤忘れちゃったパターン」が怖いですね！！！←
（コードの改善・修正は随時受け付けておりますのでよろしくお願いします。）

というわけで、みんなでカレンダー登録してほたちゃんの出勤日に女の子クラブへ遊びに行きましょう！