SlackApp on GoogleAppsScript でジム記録Botを作ってみた

# 作ったもの

ボタンを押すだけでジムに行った記録が出来る（さらに褒めてくれる:relaxed:）SlackBotを作りました:muscle:
https://github.com/cajonito/gym_record

![スクリーンショット 2020-03-20 23.56.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77401/2669cbb0-10f6-aac9-412e-06a0fbfa3165.png)
![スクリーンショット 2020-03-20 23.56.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77401/f77b26db-5d18-0828-e965-38d12c465ff9.png)
<img width="700" alt="スクリーンショット 2020-03-20 23.58.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77401/f602bf55-911c-e675-bda8-5cfee04c1743.png">



# この記事

SlackBotをGASで作った感想です。
細かい所は別記事で色々補完していきます。

開発の過程で行った環境構築方法をまとめたのでご紹介します。
[[初心者向け] GoogleAppsScript(GAS)の開発環境をインクリメンタルに構築 - Qiita](https://qiita.com/cajonito/items/3a5c7da8965e28e485bf)

# 作った経緯

もともと「Slackってよく開くし、プラットフォームを選ばないし、簡単なツールのインタフェースとして適してるんじゃないか？」と思ってSlackBotの勉強中でした。

妻からジムに行くモチベーションを高める何かを作れと言われ、後に徐々に機能を追加する事も視野に入れつつスモールスタートとしてサクッと作ってみました。

# 要件定義

妻にヒアリング

:woman_tone1:「ジムに行った日を記録したい。しばらく行ってないと危機感感じて行く。」
:woman_tone1:「なるべく面倒くさくないのがいい。ただでさえジムに行くの面倒くさいから。」
:woman_tone1:「だからたぶんスマホから出来るといい。」
:woman_tone1:「ジムに行った日を後から眺めてニマニマしたい。」

GoogleAppsScript(以下GAS)上で動くSlackBotの土台だけ作ってあったので、それを使って要求を満たせないかな？と考えた。

- Slackにあるボタンワンタッチで記録出来たら面倒くさくないかな？
- GASはHerokuみたいにスリープしないから3日起きとかの起動でもキビキビ動くはず
- GASだったらGoogleCalendarと連携出来るからカレンダーに記録すれば楽そう
- テンション上がる感じで表示したい（筋トレ応援する人が「いいね！」「まだいける！」「えらい！」とか言うの想像）

何とかなりそう。

# 全体構成

こんな感じになります。

![deployment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77401/4ae10955-ccf0-c33f-9f24-a9acffec3881.png)

ユーザーがSlackに行った操作がGASに通知され、GAS上に置かれたプログラムが通知内容を読み取りそれに適した処理を行います。
逆にGASからSlackに通知することでSlack上にテキストやボタンなどを表示することが出来ます。
またGASからは簡単に同アカウントの一部のGoogleサービスを操作出来ます。
例えば今回のツールは単純に表すと以下のようになります。

![sequence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77401/04e29fbf-eb69-61cd-b050-23f1f3a66877.png)

# 開発上で工夫した点

可能な限り少ない操作で処理したかったので、表示されたボタンを押すだけという形にしました。
GASではトリガーという機能でプログラムの指定時間実行が簡単に行えるので、毎日日付が変わったあたりでボタンを送信するようにしました。
ただその場合どんどんボタンが増えてしまうので、前日のボタンが残っていたらそのタイミングで削除します。
通知があるとうるさいのでチャンネルの通知は切ります。

# GoogleAppsScript

https://developers.google.com/apps-script (公式)

Googleアカウントに紐付いた開発環境で、GoogleAppsScriptというJavaScriptライクな言語を用いて開発が出来ます。
目立つメリットは以下のものが挙げられます。

- 無料:ok_hand:
- 環境構築が必要ない
- Googleの他のサービスと連携が簡単
- WebAPIを公開できる

個人的には上2つが大きくて、環境構築が必要ない上に無料なので初心者の方も簡単に始められるのでオススメです。
もちろん苦手な事も色々あります。以下の記事がとても参考になりました。
[GASを使うべきか否かの判断材料](https://qiita.com/mistolteen/items/c206d5970ae1a6c7813d)

さて、上にちょろっと書きましたが、GoogleAppsScriptにはURLを公開してサーバーレスWebAPIとして動作させる機能があります。
こちらを利用すればSlackBotのように他のサービスと連携する機能を無料で簡単に公開することが出来ます。

以下の記事がとても参考になりました。
[今から10分ではじめる Google Apps Script(GAS) で Web API公開](https://qiita.com/riversun/items/c924cfe70e16ee3fe3ba)

## GASのローカル開発環境構築

GASの大きなメリットをスポイルしてるような感じがしますが、作ってるうちにローカル開発環境が欲しくなってきます。
一番の理由はGitで管理できないという点だと思います。
やっぱりバージョン管理をしたいし、GitHubも使いたいです。
幸いにもGASにはClaspという公式のツールがあり、アカウントを認証させるとGASのコードをローカルにpullしたり、逆にローカルからGASへpushしたりできます。
https://github.com/google/clasp/ (clasp公式）

他のGoogle製ツールとの連携部分など、GAS上で試した方が早いものはGAS上で触ってみて、メインの開発はローカル開発で行う感じがいいんじゃないでしょうか。
ローカルで開発すれば下記のメリットは受けられます。

- 最新のJavaScriptで開発
- TypeScriptでの開発
- テストの導入
- 好きなエディタで開発

ただやり過ぎると「それGASでやる必要ある？」ってなる人もいると思うので、程々がいいと思います。
自分は全部入れました:innocent:

## GASでWebAPI開発するとデバッグが難しい

GAS上で実行する分にはGAS上のログツールを利用出来るのですが、Slackからの通知等を処理する場合ログを見られませんでした。
どうやらGoogleCloudPlatformのStackdriver使えばいいらしくGASで個人開発するなら無料枠で収まるらしいです。
https://cloud.google.com/stackdriver/pricing#service_tiers (GCP公式)

下記が参考になります。
[GAS でStackdriver Loggingを使う](https://qiita.com/HeRo/items/946dff8c9161a730ec66)

ただ、個人的には完全無料の安心感が欲しかったのでGASのみでデバッグをしてました…。
自分はSlackにログを飛ばしてましたが、SpreadSheetに飛ばすなり色々やりようはありそうです。


# 感想

GASでの開発はデバッグの難しささえ解決したら楽しくなりそうです。
これで妻がジムに行くようになったら嬉しいです。
とりあえず楽しそうに使ってくれてはいます。