PowerAutomateでOutlookに登録した予定表をTeamsのステータスメッセージに自動登録する

# やりたいこと

- Outlookの予定表に登録した出社/テレワークの予定をPowerAutomateで取得してTeamsのステータスメッセージに自動で登録したい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/1ae99731-0b52-d589-fef7-7c27bf15b66f.png)

# 方針

- PowerAutomateで0時過ぎに日次でフローを動かす
- 現在日時を取得し、Outlookに登録された予定を取得する
    - Teamsに設定したいステータスメッセージはOutlook側で任意の文字列から開始する予定を対象とする
        - 今回で言うと「★テレワーク」「★出社」のような予定を対象とする
- 取得できた予定をSharePointのAPIを利用してTeamsのステータスメッセージを更新する
    - Outlookの予定の「公開方法」が「他の場所で作業中」または「外出中」として登録された予定はTeamsステータスメッセージの「他のユーザが自分にメッセージを送るときに表示する」のフラグをONにして登録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/2135db76-3fc6-f1d4-1ebf-5df5a8f40e88.png)


# 全体図

まずはじめに全体図
次のセクションから詳細を記述していきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/35ac9a1a-2908-8adb-593d-b0a170435cff.png)



# やり方

Microsoft Automateのサイトへアクセス

https://japan.flow.microsoft.com/ja-jp/



## フローの作成

作成→スケジュール済みクラウド フローを選択し、
任意の名前を設定する。
(後に設定し直すので他のオプションはとりあえずそのままでOK)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/efebef57-4484-15e0-8a3e-0d26078a8601.png)

## 実行間隔の設定

作成されたフローの先頭にあるRecurrenceの中の詳細オプションからタイムゾーンと設定時刻(時間)、設定時刻(分)を設定する。
(今回の場合1日に1回Outlookから予定を参照し、Teamsのステータスメッセージを更新したいので、1日に1回、日付を超えた辺りの時間に実行しておけばいいのでAM0:10を指定)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/afc90105-f376-d76a-6764-d2cd2ecb4d82.png)

## 現在日時の取得

新しいステップを追加し、「日時」で検索→現在時刻の取得を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/c143aec3-b01a-c301-7ada-3947349b4a52.png)

## Outlook予定の取得

新しいステップを追加し、「Outlook」で検索→「イベントの取得(V4)」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/ea6e81fc-34f2-3bfb-2dbc-e777825058c2.png)

予定表IDは自分の予定表を選択する(おそらくデフォルトで使用している場合「予定表」が自分の予定表)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/0b6ab09a-f3f7-bef7-01db-45ecc51cf93d.png)

フィルタークエリに

```
start/datetime le '{現在の時刻}' and  end/datetime ge '{現在の時刻}' and startsWith(subject, '★')
```

※`{現在の時刻}`の箇所は動的なコンテンツから選択します


上から順に取得に`1` を設定
(1件だけ取得)
※今回の例でいうと1日に`★`から始まる予定は1件しかない想定としているため、ソート等は考えずに1件だけ取得するようにしています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/b90160fb-760d-3035-9853-5398e578433f.png)


## Teamsで表示するメッセージの初期化

新しいステップを追加し、「変数を初期化する」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/14e033af-6af5-312c-ab32-27c1aa56031a.png)


任意の名前を設定し、種類は`文字列`を選択
値には式に`formatDateTime(body('現在の時刻'), 'yyyy/MM/dd')`と入力
※`body('現在の時刻')`の箇所は動的なコンテンツから選択できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/09a0d3d2-dfb0-3a5f-443d-75685ee44dbb.png)

## Outlookで取得した予定のループ処理

新しいステップを追加し、Apply to eachを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/0130caa0-62c6-f518-17cc-ada2ac8d3f72.png)

`以前の手順から出力を選択`の箇所には動的なコンテンツ > イベントの取得(V4)の中にある`value`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/23ab9fbe-304a-d4d6-0c03-44add0c20121.png)

### メッセージの追加

Apply to each内に新しいステップを追加し、`文字列変数に追加`を選択
→先程初期化した変数にOutlook予定の`件名`を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/85e51407-d048-4f97-5b25-7e7c646e10c8.png)

(ここまでで変数の値には`2022/04/11 : ★テレワーク`のような値になっています)

### 条件分岐

新しいステップを追加し、`条件`を選択
→条件として`表示方法`が`workingElsewhere`(他の場所で作業中) または `off`(外出中)となるように入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/0da95ead-d4b3-f5ea-a3f3-54adf73b52ad.png)

### メッセージの追記

表示方法(Outlook側では公開方法)が「他の場所で作業中」または「外出中」のときだけ、
Teamsのステータスメッセージの「他のユーザが自分にメッセージを送るときに表示する」をONにしたいので、`はいの場合`のステップとして、文字列変数に追加のステップを追加し、`<pinnednote></pinnednote>`の文字列を追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/088e30ac-1d8d-2a17-5183-8a1e62b7c502.png)

### ShareポイントにHTTPリクエスト

条件分岐を抜けた後のステップに`SharePointにHTTP要求を送信します`のステップを追加し、下記の通り選択

|項目|値|
|---|---|
|サイトのアドレス|https://presence.teams.microsoft.com|
|方法|PUT|
|URI|/v1/me/publishnote|
|ヘッダー|キー: content-type <br> 値: application/json|

ボディ

```
{
    "message": "@{variables('statusMsg')}",
    "expiry": "@{addDays(body('現在の時刻'), 1)}"
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/5b587fd2-3aa8-93db-1825-8f0c6230368c.png)

※サイトのアドレス入力時にエラーメッセージが表示されることがありますが、その場合、一旦保存すれば消えます(バグっぽい・・・？)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/c3c6c526-367d-2699-a1a1-bfb80bcdda1e.png)

## 動作確認

ここまでで手順としては終了です。
保存後、画面右上の`テスト`から手動で実行して動作確認をしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/4a9e7c72-1276-5ad6-b6c7-b240acdc13a0.png)

手動実行後のフロー実行ページで`成功`と表示されているか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/6938c9f8-f8c5-0832-393b-e7fe2bff5b91.png)


Teamsのステータスメッセージに想定している内容が表示されているかどうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/bf5d0b22-3f77-3e45-cd60-920a9bb234da.png)

等を確認して設定完了です！



# 作ってみて

## 良くなかった点

- Microsoft周りのドキュメント、本当にわかりにくい。。。先駆者が居てくれたお陰でなんとなくどんな使い方をすればいいか知ることができたが、公式のドキュメントだけで理解するのは難しい
- ノーコードだとかローコードとかよく言われているが、自分には逆に難しかった。プログラムを普段組まない人が難なく作ることができるかと言われると、難しいのかもしれない。。。特に何かエラーが起きたときにサクッと解決できる気はしなかった

## 良かった点
- 認証やセキュリティ周り、環境等は一切考えずに実装できたのは楽だった

## 今後の方針

- Outlookの予定表の取得範囲を1週間先まで見て、有給取得日が含まれていたらメッセージに更に追記する。といったこともやってみようと思います。


# 参考サイト

- [【Power Automate for cloud】ボタン一つでTeamsのステータスメッセージを設定する](https://powerplatformnikki.com/powerautomateteamsstatusset/)