slack TimeTreeの今日の予定を自動で投稿する

#はじめに
こちらの記事は**TimeTreeというカレンダーアプリを使用することを前提**として進めます。

私は大学の課題の提出締め切りをTimeTreeで管理しているのですが、携帯の通知だと見逃してしまうのでslackにリマインドさせて忘れないようにしようと思ったのがきっかけです。

#作成目的
大学がオンライン授業になり、課題の締め切りが授業によって違うため、締め切りを自動でお知らせしてもらい提出を忘れないようにするため。


#サイクル

1. botが毎日決まった時間に課題リマインド用のチャンネルで@TimeTreeコマンドをたたく
1. TimeTreeが今日の予定を知らせる

TimeTree Appの仕様は、ユーザーから@TimeTreeを利用したコマンドを入力してカレンダーの情報を取得します。
>【予定を確認】
Slack上でTimeTreeの予定の確認ができます。
下記のコマンドをSlack上で入力してください。
@TimeTree 今日
@TimeTree 明日
@TimeTree today
@TimeTree tomorrow

#作成手順
1. [slackにTimeTreeのAppを追加する](https://qiita.com/UNAi7/items/7bc7a00b10edbdbafac4#slack%E3%81%ABtimetree%E3%81%AEapp%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)
1. [自動投稿botを作る](https://qiita.com/UNAi7/items/7bc7a00b10edbdbafac4#%E8%87%AA%E5%8B%95%E6%8A%95%E7%A8%BFbot%E3%82%92%E4%BD%9C%E3%82%8B)
1. [投稿内容を編集する](https://qiita.com/UNAi7/items/7bc7a00b10edbdbafac4#%E6%8A%95%E7%A8%BF%E5%86%85%E5%AE%B9%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B)
1. [投稿する時間を決める](https://qiita.com/UNAi7/items/7bc7a00b10edbdbafac4#%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%99%82%E9%96%93%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B)

###slackにTimeTreeのAppを追加する
まず追加したいワークスペース上でサイドバーから「アプリを追加する」を選択します。
![APPplus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/fcfdea91-a8f5-bc00-8d8e-e76fa80736f2.png)

次にApp一覧から検索バーに"timetree"と入力し、TimeTreeのAppを検索。「追加」をクリックします。
![searchTimeTreeApp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/3452e311-d861-f868-5c70-c2e44d0d21f5.png)

Appの詳細ページに飛ぶので左の「slackに追加」をクリックしてください。
![slackappPlus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/e83cbce1-7cfb-c06f-f249-dece6ebb5f12.png)


TimeTree側からslackとの連携を設定するページが表示されるので「Connect」を選択します。
![timetree-connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/8145e2d8-c610-cb93-5407-e9327432ebc0.png)

連携するカレンダーを選択。slackから予定を作成するときのラベルカラーも選択し、連携ボタンを押します。
![slack-timetree-connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/1dee0c59-6fdf-9e94-aa39-3de0f25b63b1.png)

今度はslack側からTimeTreeのAppを追加するワークスペースを聞かれるので、追加したいワークスペースを選択し、「許可する」をクリックします。
![timetree-workspace-connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/31e8fdbf-bf5d-03a1-43f0-5a3613c85ade.png)


TimeTreeから画像のようなDMが届いたら連携完了です！
![timetree-message.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/719f15b1-4a65-12ba-bddd-1abef9e6f920.png)


###自動投稿botを作る
こちらの記事を参考にbotを作成しました。作成方法は記事内に詳しく載っているため割愛します。

https://auto-worker.com/blog/?p=2904

またこちらの記事でGoogle Apps Script(GAS)を使ってslackのライブラリを取得し、プログラムを書いていたのですが、私自身GASをGoogleスプレッドシートからしか使ったことがなくどうやってプログラムを作るのかに困ったため、GASを使えるようにするための設定方法を書いていきます。
[参考記事](https://qiita.com/UNAi7/items/7bc7a00b10edbdbafac4#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%95%E3%81%9B%E3%81%A6%E3%81%84%E3%81%9F%E3%81%A0%E3%81%84%E3%81%9F%E8%A8%98%E4%BA%8B)のところにもその際、見た記事が載っています。

1. Google Driveを開く
1. 適当なところで右クリック→「その他」→「アプリを追加」<br>
（デフォルトだとGASは入っていないとのこと）
![google-drive-plus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/abd36862-48b7-ff05-0327-e1add7f9251e.png)
1. Google Workspace Marcetplaceから上の検索バーに"google apps script"と入力し、インストール
（インストール済みだとこうなります）
![search-gas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/89c3972e-292b-3caf-99c9-a8efb65ef135.png)
![gas-install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/a256b4d8-50be-ae0e-8c9c-4e8df0f421fc.png)

これでGASが使えるようになりました！
再度GoogleDriveを開き、右クリックするとGASがアプリとして追加されているのでそこからプログラムを作ることができます。
GASが追加出来たらbotを作成していきます。


###投稿内容を編集する
botが作成できたら、次はbotが@TimeTreeコマンドをたたけるようにします。
postSlackbotメソッドの投稿内容の部分を編集します。

```javascript
//Slackボットが投稿するメッセージを定義する
let message = "<@TimeTreeのuserID> today"
```

**botがメンション機能を使用するときはメンション先のuserIDを取得し、<>で囲う**ことでメンションができます。

TimeTreeのuserIDは以下の流れで取得できます。

1. slackのサイドバーのAppからTimeTreeのDMを開く
1. 上部のアイコン付きの「TimeTree」というところをクリック
![timetree-getuserID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/a55771b4-fa6a-351d-789a-15e7731fc2ca.png)
1. 一番下のメンバーIDをコピー
（ワークスペースによって異なるかもしれないので隠しています）
![timetree-userID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/9c27cabb-1cfc-c6ad-c975-59261e53c9d3.png)

成功したら画像のようにbotが自動で@TimeTreeコマンドをたたいてくれます。
![slack-bot-success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/e09ea3da-fabf-f9f9-802c-d185211cf95a.png)

### 投稿する時間を決める
GASのトリガーという機能を使ってプログラムの実行タイミングを決めていきます。しかし、デフォルトだと設定した時間内の間のどこかで実行という仕様になっているようです。（9:00~10:00で設定したら、60分の中のどこかで実行される）
そのため毎日決まった時刻に実行するためのプログラムを書きます。

[こちらの記事](https://www.pnkts.net/2019/09/23/gas-set-trigger
)を参考に、毎日9時に投稿されるようなプログラムを書きました。
時間は**今の時間より後の時間でないと実行されない**ため、気を付けてください。

```javascript
//トリガーを設定する
function setTrigger() {
 var setTime = new Date();
  setTime.setDate(setTime.getDate() + 1)
  setTime.setHours(09);
  setTime.setMinutes(00); 
  ScriptApp.newTrigger('postSlackbot').timeBased().at(setTime).create();  
}
```

プログラムができたら、サイドバーからGASのトリガーを開きます。
![select-trigger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/1418480b-c1c2-fe41-6083-32491aeff814.png)

右下にある「トリガーを追加」ボタンを押して画像のように設定します。
![スクリーンショット 2021-09-21 21.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/e02a4201-5572-d224-4aa7-1121b0736520.png)

次の日、しっかりお知らせしてくれました！

実行までに1分程度かかりそうなので、少し早めにトリガーを設定してもいいかもしれないですね！
![スクリーンショット 2021-09-21 21.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562324/d0571d87-fc83-38a1-6e76-547919713c1c.png)


#参考にさせていただいた記事

* slackbotの作り方

https://auto-worker.com/blog/?p=2904

* TimeTreeをslackでメンションする

https://teratail.com/questions/351458

* GASのスクリプト実行時に承認が通らない問題

https://tonari-it.com/gas-script-approval/#toc4

* 毎日決まった時刻にプログラムを実行する

https://www.pnkts.net/2019/09/23/gas-set-trigger