TeamsにWebhookを使って自動で定期的なリマインド投稿をする方法

# やりたいこと
定期的なリマインドを自動でTeamsに投稿したい。
例えば、「経費申請は明日が締め切りなので今日までに申請してね」とか忙殺されがちな月次事務処理の連絡とか。
自動でチーム全体に通知が届けば、「いつも前もって申請してよ」から解放されるはず。




# まずはTeamsにWebhookで投稿をしてみる


## 事前準備

Webhookを受信する準備を整えます。

以下を参考に受信したいチームのチャネルに対して受信Webhookを作成する。

https://docs.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook#create-an-incoming-webhook


## Webhookとは？

Webサービスやアプリケーションに用意されたURLにPostのHTTPリクエスト送ることで
Webサービスやアプリケーションに通知や更新の動作をさせること。

jsonのパラメータを渡してリクエストすることで、Webサービス側で受け取ったパラメータを利用した通知を表示してくれたりします。


↓を見るとわかりやすいと思います

https://qiita.com/soarflat/items/ed970f6dc59b2ab76169


## Webhookしてみる

PowerShellを立ち上げてリクエストしてみる
```powershell
$url = "受信WebhookのURL"
$body = ConvertTo-JSON @{
    title = '連絡'
    text = '経費申請は明日が締め切りなので今日までに申請してね'
}
$body = [Text.Encoding]::UTF8.GetBytes($body)
# Postする
Invoke-RestMethod -Method Post -Uri $url -Body $body -ContentType 'application/json'
```


#### こんな感じに投稿される
![1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75217/c5d812aa-2056-4b92-3ae1-178fc2738b45.png)

よしよし
あとはWindowsのタスクスケジューラに登録すれば‥

だと、PCの起動状態に左右されるし、
サーバーがあればそれを使ってもいいけど

どうせならGoogleAppScriptを使って定期的にリクエストをすることで
PCの電源をoffにしていても自動投稿される仕組みが望ましい。


## スプレッドシートを開こう

![1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75217/8d47a2df-c9df-41a1-47ce-34ee6efb136c.png)


スクリプトを追加する。

```js
function postTeams() {
    const postContents = {
        "type": "message",
        "attachments": [{
            "contentType": "application/vnd.microsoft.card.adaptive",
            "contentUrl": null,
            "content": {
                "type": "AdaptiveCard",
                "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
                "version": "1.4",
                "body": [{
                    "type": "Container",
                    "items": [{
                        "type": "TextBlock",
                        "text": "経費申請の連絡",
                        "wrap": true,
                        "style": "heading",
                        "color": "Accent"
                    }],
                    "style": "accent"
                }, {
                    "type": "Container",
                    "items": [{
                        "type": "TextBlock",
                        "text": "経費申請は明日が締め切りなので今日までに申請してね",
                        "wrap": true,
                        "style": "default",
                        "size": "Medium",
                        "weight": "Bolder"
                    }, {
                        "type": "ActionSet",
                        "actions": [{
                            "type": "Action.OpenUrl",
                            "title": "今すぐ申請する",
                            "style": "positive"
                        }]
                    }]
                }]
            }
        };]
    };
    var webhookUrl = '受信WebhookのURL';
    var params = {
        method: 'post',
        contentType: 'application/json',
        payload: JSON.stringify(postContents)
    };
    var response = UrlFetchApp.fetch(webhookUrl, params);
}

```
titleとtextだけ渡してもいいけど、
AdaptiveCardを使うことで見た目のレイアウトも変更できる。

↓を使うことでGUI操作で簡単にデザインができるのでとても便利。

https://www.adaptivecards.io/designer/


### 毎月指定した日に実行させるトリガーを作成する

締め切りは10日なので、毎月前日の9日の朝9時～10時に投稿させよう。

![1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75217/6abdc0a2-5903-6bf1-5372-e7f8a23de312.png)


## ちょっと見た目が際立つ感じで投稿されました

![1_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75217/5cca09fc-f408-f6ad-5b85-9424b19c3104.png)
（※時間が違うのは手動で実行したから）


## 注意点

* 残念なことにチーム全体やチャネル全体へのメンションがまだできない。（みんな気付いてくれるだろうか...）
※ユーザー個人にはメンションできるみたいです。