Power Automate を使って Outlook に登録した休暇情報を Teams でも表示する

こんにちは。株式会社 エーティーエルシステムズ 中村です。

有給休暇を取るとき、他のメンバーに周知するため Outlook へ登録するようにしています。  
しかし、Outlook に登録するだけでは他のメンバーが本人のカレンダー情報を確認してもらう必要があり、手間がかかります。

この記事では、Power Automate を使用して Outlook に登録された休暇情報を Teams ステータスメッセージに自動設定する方法について解説します。

## Teams の「ステータス メッセージ」とは

Teams には [ステータス メッセージ](https://support.microsoft.com/ja-jp/office/microsoft-teams-%E3%81%A7%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B-22e02023-3840-40c7-b701-6676821aeab3) という機能があり、これを使うと相手がダイレクトメッセージを送るときに応対できないことを示せたり、ユーザー表示時にメッセージを出せたりします。  
これらは以下のように表示されます。

![Teamsアプリにおけるユーザー状態の画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/916ba41b-75ed-c7c0-488c-ace4dbfb8a00.png)

## 実装方針とPower Automate のフロー図

次のように運用していることを前提とします。

- 休暇日は、Outlook にて休暇する時間帯を指定して予定を作成
- 予定は、分類「休暇」に属するように設定する

![Outlookの予定作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/d0aaba4f-a60c-72a9-3a62-42fa3b158104.png)

最終的には、以下のようなフローを作成します。

```mermaid
flowchart TD
    %% アクティビティの定義
    StartEventTrigger([イベントが開始されるとき])
    SetPresenceBaseUrlVariable[リクエスト先の変数を定義する]
    ForEachStartSchedules[/予定ごとに処理を行う\]
    ForEachEndSchedules[\予定ごとに処理を行う/]
    IfCategoryContainsHoliday{カテゴリに「休暇」が含まれるか?}
    RequestPublishnoteEndpoint[ステータスメッセージの更新を実施]
    End([終了])

    %% フロー関係性
    StartEventTrigger --> SetPresenceBaseUrlVariable
    SetPresenceBaseUrlVariable --> ForEachStartSchedules
    ForEachStartSchedules --> IfCategoryContainsHoliday

    IfCategoryContainsHoliday -- 含まれる --> RequestPublishnoteEndpoint
    RequestPublishnoteEndpoint --> ForEachEndSchedules
    IfCategoryContainsHoliday -- 含まれない --> ForEachEndSchedules

    ForEachEndSchedules --> End
```

実際にフローを作成するための手順を以下で説明します。

## フローを作る

### 1. フローを作成する

[Power Automate のページ](https://make.powerautomate.com/) にアクセスし、左側ナビゲーションバーから「作成」をクリックします。  
その後、「一から開始」画面で、「自動化したクラウドフロー」をクリックします。

![「一から開始」画面で、「自動化したクラウドフロー」をクリックする](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/81765874-4ea2-9046-005a-464b81d93b99.png)

「自動化されたクラウド フローを構築する」画面で、以下のように入力します。

- フロー名: 任意の名前を設定します。ここでは、「休暇をTeamsステータスメッセージに反映する」としました
- フローのトリガー: 「予定している」と入力し、出てくるいずれかを選択します。社用アカウントの場合 Microsoft 365 アカウントであるはずなので、「Office 365 Outlook」の方を選びます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/c46efb80-204a-c70a-c604-da40ea10886a.png)

### 2. 新しいデザイナーのスイッチをオフに切替

画面が切り替わり、フローを構築する画面になります。  
2024/05/14 時点では、Power Automate の「新しいデザイナー」では動的なコンテンツの記述がうまく動作しないため、古いデザイナー画面で作業します。

画面右上にある「新しいデザイナー」をクリックし、古いデザイナー画面に切り替えてください。

![新しいデザイナーのスイッチ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/5bb25cd4-001f-6a5b-959c-a4d36764d945.png)

### 3. カレンダーを選択

「予定しているイベントが間もなく開始されるとき (V3)」の「カレンダー ID」をクリックし、「予定表」を背選択します。  
このとき、予定を入れているカレンダーが別にある場合は、該当する別のカレンダーを選択してください。

![カレンダーを選択する画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/b0aca729-8844-1c69-097e-a75f066240f0.png)

この設定を行うことで、予定表に登録された予定が開始される数分前にこのフローが実行されるようになります。

### 4. リクエスト先についての変数を初期化

このあと利用する SharePoint への HTTP 要求アクションの不具合で、URL を直接記載できないので変数で定義します。

「新しいステップ」をクリックし、検索欄で `変数を初期化` と入力します。以下の画像のように、「変数を初期化する」をクリックします。

![「変数を初期化する」アクションの追加画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/e6c1adf7-8c9a-df42-69d2-c0a53841ba98.png)

その後、3つの項目を以下のとおり設定します。

- 名前: `presenceBaseUrl`
- 種類: `文字列`
- 値: `https://presence.teams.microsoft.com`

![変数を初期化するアクションでの設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/8ec0885d-9189-0256-ac84-de12af36e011.png)

### 5. 休暇分類に属していることを確認する条件を追加

休暇予定の場合、分類で「休暇」を選択しています。間もなく開始される予定が「休暇」であることを確認するため、次のように操作します。

「新しいステップ」をクリックし、検索欄で `条件` と入力します。以下の画像のように、「条件」をクリックします。

![新しいステップの作成画面で、条件を選択した画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/999b6758-e75f-6eed-7354-2a82f7f704c9.png)

表示される条件にて「動的なコンテンツの追加」をクリックし、「カテゴリ」を選びます。

![「動的なコンテンツの追加」をクリックし、「カテゴリ」を選んだ画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/e42c88b1-e446-15d3-6e5a-ebd256e01118.png)

さらに、「次の値に等しい」という部分を「次の値を含む」に変更したあと、右側の入力欄で「休暇」と入力します。

![「次の値を含む」を選択、「休暇」を入力した画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/e525d749-23cf-427b-2500-b68cd4a1aae5.png)

これにより、カテゴリに「休暇」が含まれるかどうかを判定できるようになりました。

### 6. ステータスメッセージを更新するリクエストアクションを追加

さきほど追加した条件で、「はいの場合」にある「アクションの追加」をクリックします。

![「はいの場合」にある「アクションの追加」をクリックする画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/2c3f63a9-01fa-2f0b-5f4e-8b8a29afe324.png)

検索欄で `sharepoint http` と入力します。以下の画像のように、「SharePoint に HTTP 要求を送信します」をクリックします。

![「SharePoint に HTTP 要求を送信します」アクションの追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/f0a7c750-6e1f-5412-fae4-8161bd815b2b.png)

次の通り設定します。

- サイトのアドレス: 先ほど作成した変数「presenceBaseUrl」を指定
- 方法: `PUT`
- URI: `/v1/me/publishnote`
- ヘッダー
    - `Content-Type`: `application/json`
- ボディ: *後述*

サイトのアドレスを指定するときには、入力欄をクリックし「カスタム値の入力」、その後「presenceBaseUrl」変数をクリックして設定します。

![入力欄をクリックし「カスタム値の入力」](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/09415a0f-7c9a-2665-25fc-1a01878e7a23.png)
![「presenceBaseUrl」変数をクリックして設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/ba363047-d296-3a5f-53fa-75e8a504f0cd.png)

ボディに設定する値は、以下の JSON 文字列を貼り付けます。message の値は、表示したいメッセージに変更してください。

```json
{
  "message": "@{formatDateTime(addHours(triggerOutputs()?['body/startWithTimeZone'], 9), 'MM/dd')} は休暇をいただいており、連絡が付かない可能性がございます。<pinnednote></pinnednote>",
  "expiry": "@{triggerOutputs()?['body/endWithTimeZone']}"
}
```

これにより、「04/01 は休暇をいただいており、連絡が付かない可能性がございます。」のように表示することができます。

また、`<pinnednote></pinnednote>` を末尾につけることで「他のユーザーが自分にメッセージを送るときに表示する」にチェックを入れた状態になります。  
これにより個人チャットでメッセージを貰うときなどに、相手に設定したステータスメッセージを表示することができます。

ここまで操作すると、アクションは以下のようになります。

![「SharePoint に HTTP 要求を送信します」アクションの最終形](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/f729a497-d9de-d09f-25e5-b6ff9a90289a.png)

## 動作テスト

ここまで作成したフローをテストしてみます。画面右上の「テスト」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/6de63235-edcc-1f6b-bc40-7b18b0d6a1e2.png)

「フローのテスト」画面が出てきたら、「手動」を選択して「テスト」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/cc945e6e-1a03-6b03-1768-e2da50aeee0d.png)

あわせて、テストのため Outlook で予定を作成します。最低限、以下の設定を行います。

- 開始時刻: 5分程度あとに設定
- 分類: 「休暇」を選択（存在しない場合は「すべての分類項目」から作成）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/c69e5b28-d917-262d-cf4c-dfa883fad451.png)

すこし待つと、Power Automate の画面が切り替わり「ご利用のフローが正常に実行されました」と表示されます。  
ここでエラー表示になった場合は詳細を確認し、フローを修正してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/63ff453d-228f-7159-2888-7bdc74aa8f73.png)

Teams で自分自身のプロフィール画面を確認すると、ステータスメッセージが更新されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659670/ee6ec030-7243-25c4-919d-4ba13f37f220.png)