Power AutomateでTeamsの予約送信フローを作る

# はじめに
定期実行のフローはあったが日時指定で実行できるようなフローがなかったため。
予約送信に限らず不定期な日時指定実行にも使えると思います

# 作る
## 方針
![無題のプレゼンテーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/32869f59-31c9-1610-56c3-fd6f8d976f61.png)
予定日時まで待機して、待機が終わったら送信します。
並列処理にしたのは並列処理使ってみたかったからです。


## トリガーをつくる
### トリガーの選択
![フローの管理 _ Microsoft Power Automate - Google Chrome 2021_06_03 20_56_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/2d24e329-09c3-7f3d-c8ee-c5d39392f58d.png)
今回は手動で実行させたいので`インスタントクラウドフローを構築する`>`手動でフロートをトリガーします`を選びます。

### トリガーの入力
![フローの管理 _ Microsoft Power Automate - Google Chrome 2021_06_03 21_04_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/94672705-b55c-a782-508f-99150df98b13.png)
トリガーの設定をします。
入力の追加から必要な項目を追加してください。
メンションはしたいときとしたくない時があるので右の…からフィールドをオプションにします。

##　Teamsに送る部分を作る
### アクションの選択
![フローの作成 _ Power Automate - Google Chrome 2021_06_03 21_10_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/16cfd885-b014-c8d3-7a16-37a419307223.png)
`+ 新しいステップ`から開いたダイアログの検索窓にTeamsを入力して`アクション`の中から`チャットまたはチャネルでメッセージを投稿する(プレイビュー)`を選択します
### アクションの設定
![フローの作成 _ Power Automate - Google Chrome 2021_06_03 21_14_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/62bfcc4c-92a9-2372-93db-3528ce8797e9.png)
連携するかどうか聞かれた場合は許可します。
下矢印を選択すると自動で自分のアクセスできるTeamが表示されるのでそれを選びましょう。
ここまで出来たら一度保存し、実行してみます。
![一般 (testTeam) _ Microsoft Teams 2021_06_03 21_20_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/7b29e69d-3876-f737-c68f-5dc148b61372.png)
メッセージの送信ができました。
### 実行時に入力したメッセージを送信する
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 21_24_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/12f13099-bc38-89b8-099c-1c446bfd0b41.png)
`動的なコンテンツ`タブを選択して下のボックスにトリガー作成時の項目名を入力選択します。
これで保存し実行すると、実行時に指定したメッセージがTeamsに送信されます。

## 宛先ユーザーの取得とメンションつけての送信
### アクションの追加
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 21_29_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/d556def7-77fc-881a-86f7-a5228879b76f.png)
メッセージ送信の前に`アクションの追加`をします

![フローの編集 _ Power Automate - Google Chrome 2021_06_03 21_32_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/0fcd4945-2c48-0f0a-e385-7fdb52d9a8d5.png)
メッセージのアクションを作った時と同じように、今回は`ユーザープロフィールの取得(V2)`を選択します

![フローの編集 _ Power Automate - Google Chrome 2021_06_03 21_36_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/d3287dba-0b37-b6fc-a5ee-c666dc3c4dde.png)
動的なコンテンツから、トリガー作成時に指定したアドレスを入力する項目名を検索し、選択します。

### メンションする
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 21_38_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/0a5fd34c-49d4-1ef7-0f59-de28e5e878ef.png)

メッセージのアクションを開き、メッセージをHTML入力できるようにします。
動的コンテンツから`ID`を取得し`<at></at>`で囲みます。
これで実行すればメンションつけて送信することが可能です

## メンションつけない場合の分岐
### アクションの追加
メンションつけたくない場合、メッセージ送信するときに存在しない`ID`を取得しに行ってエラー吐いてしまうので、メンションつける時とそうではない時の分岐をいれます。
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 22_18_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/6fe7ff4d-7455-7cf5-ebd3-61d477ba196c.png)

メッセージ送信の前とユーザープロフィールの取得の前に条件アクションをいれます。

### アクションの設定
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 21_48_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/c9b33b47-9e81-d7a2-70e5-49dcc667d9b5.png)
トリガーでメンションするかしないかのスイッチを用意したので、それを条件にします。
スイッチは←がoff(false)で、→がon(true)なので、`メンションする`を選択したときtrueになります。
それぞれの分岐に同じ条件を指定してください。

![フローの編集 _ Power Automate - Google Chrome 2021_06_03 22_21_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/f8e4dd9d-a535-ad60-ff4f-4b83dc1e51e0.png)
ユーザープロフィールの取得は、はいのほうにドラッグしてください。
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 22_22_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/8f685db8-6b74-0593-e405-d82b6cd04d9c.png)
宛先ありメッセージもはいのほうにドラッグし、いいえのほうには宛先無しメッセージのアクションを追加します

## 待機時間の設定
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 22_27_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/e6f794f2-f935-4aef-c44b-29eb3cd3e003.png)

並列分岐の追加をします。

入力した日付の形式では日時の計算ができないのでフォーマット変換します
### アクションの追加
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 22_32_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/61063864-3ef5-00d6-659d-8a5db4afe7b2.png)
変数の初期化を選択します。
###アクションの設定
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 22_36_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/b53a4fd9-0f18-888e-2e84-bd84b1785b39.png)
値は`式`タブを選択して`ticks(formatDateTime(triggerBody()['text'],'yyyy-MM-dd hh:mm'))`を入力してOKを押します。

 `ticks()`
   1月1日 0001 12:00:00 午前0時から指定したタイムスタンプまでの100ナノ秒間隔の値を返却します
`formatDateTime()`
 StringからDate型にフォーマットしてくれます
`triggerBody()['text']`
トリガーで入力した値です
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 22_42_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/1ca11064-bc00-6ac3-69ba-9ee87f7877b1.png)
トリガーのコードのプレイビューから
<details><summary>コードのプレービュー</summary><div>

```json
{
    "kind": "Button",
    "inputs": {
        "schema": {
            "type": "object",
            "properties": {
                "text": {
                    "title": "予定日時(yyyy-MM-dd hh:mm)",
                    "type": "string",
                    "x-ms-dynamically-added": true,
                    "description": "yyyy-MM-dd hh:mm",
                    "x-ms-content-hint": "TEXT"
                },
                "text_1": {
                    "title": "投稿メッセージ",
                    "type": "string",
                    "x-ms-dynamically-added": true,
                    "description": "メッセージ",
                    "x-ms-content-hint": "TEXT"
                },
                "boolean": {
                    "title": "メンション::しない/する",
                    "type": "boolean",
                    "x-ms-dynamically-added": true,
                    "description": "[はい] または [いいえ] を選択してください",
                    "x-ms-content-hint": "BOOLEAN"
                },
                "text_2": {
                    "title": "アドレス",
                    "type": "string",
                    "x-ms-dynamically-added": true,
                    "description": "メンション先のメールアドレスを入力してください",
                    "x-ms-content-hint": "TEXT"
                }
            },
            "required": [
                "text",
                "text_1",
                "boolean"
            ]
        }
    }
}
```
</div></details>
を見るとjson形式のコードが見えます。
今回は予定日時がほしいので、そこのブロックのキー値textを取得してます。

同様に、現在日時(now)と待ち時間(waitMin)の変数を作ります
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 22_53_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/84eeabbb-f20d-f82c-cb88-77dba78e048e.png)

現在日時の値：`ticks(addHours(utcNow(), 9, 'yyyy/MM/dd HH:mm'))`
待ち時間の値:`div(sub(variables('planDate'),variables('now')),600000000)`
を設定します。
待ち時間は(予定日時-現在日時)/600000000で単位分に直してます

## 待機の設定
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 23_03_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/072c461a-0199-e21b-447c-5ce985586f02.png)

### アクションの追加
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 22_59_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/007d07c9-2036-5fda-5117-136412504f4f.png)
中央にある新しいステップをクリックし遅延を選択します
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 23_01_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/c64ce8f1-3e8d-cd7b-5a38-e5c9f5723be6.png)
## アクションの設定
![フローの編集 _ Power Automate - Google Chrome 2021_06_03 23_03_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/389b910f-8fe7-06b1-a945-d309191a4f39.png)
カウントには上で計算した待ち時間
単位は分に設定します。

![フローの編集 _ Power Automate - Google Chrome 2021_06_03 23_06_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/e6423cbb-dba4-5d99-90ed-fb9dd9f17aee.png)
最初に作ったメッセージの分岐が、上のほうにあると思うので、待ち時間の下にドラッグしてきます。


# まとめ
これで予約送信が可能になりました👏👏👏👏
が、例外起きても投げっぱなしなので、このままだとメールアドレス間違えて入力したり日付のフォーマット間違えてても気づけないです。
気が向いたら例外処理のところも書きます