Power Apps でアプリの利用者ごとに Teams 通知先を設定する

# はじめに

今回は、以下のよな日報、勤務状況を同僚にシェアするアプリを例に、Power Apps でアプリの利用者ごとに通知先の Teams チャネルを設定する方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4368999f-ebbd-e7bd-4d87-4b8b0777ea1d.png)

これにより、通知先の Teams チャネルが異なるために、チームごとにアプリを分けて運用する必要がなくなり、広い範囲に展開がしやすいアプリとなります。

:::note
リモートワーク、ハイブリッドワークが増えたことで、今までと違う方法で同僚と日報や勤務状況等をシェアするニーズが高まったという認識です。個人的に Power Apps、Power Automate、Teams を組み合わせることで、このような情報のシェアが効率的にできると思います。
私が所属するチームでも、これらを組み合わせて働き方などを日々共有しております。
:::

# 実装方法

今回は、以下のような設定画面を例に実装方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/52be2ff2-c832-e142-87cf-e3280accf596.png)

## Power Apps で Teams 通知先を設定する

こちらは非常にシンプルです。
まず、Teams コネクターを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/777064ed-b9f5-9545-454f-ef69c2694ad6.png)

コンボボックスを配置し、`[Items]` プロパティを以下のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/30fcefd4-bc55-f3a3-6b59-7e4037ef31ab.png)

```
MicrosoftTeams.GetAllTeams().value
```

また、`[DisplayFields]` と `[SearcFields]` を displayName にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/35a8c8f2-9df9-8bcb-33b3-512dd39aba1d.png)

次に、チャネル名についてもコンボボックスを配置し、`[Items]` プロパティを以下のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/042a6886-26d4-513a-7e9a-2254723df6e8.png)

```
MicrosoftTeams.GetChannelsForGroup(cmbTeamName.Selected.id).value
```

こちらも、`[DisplayFields]` と `[SearcFields]` を displayName にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/2c2bda04-bb31-2edc-a888-38d254cbd3fb.png)

ボタンの `[OnSelect]` プロパティの処理は以下のようなイメージです。
※設定変更をする際の処理も書いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/075ca325-75af-60ef-a574-34164671be16.png)

```
If(
    CountRows(colMySetting) = 0,
    Patch(
        通知先設定,
        Defaults(通知先設定),
        {
            ユーザー名: gblCurrentUser.displayName,
            ユーザーUPN: gblCurrentUser.userPrincipalName,
            チーム名: cmbTeamName.Selected.displayName,
            チームID: cmbTeamName.Selected.id,
            チャネル名: cmbChannelName.Selected.displayName,
            チャネルID: cmbChannelName.Selected.id
        }
    ),
    Patch(
        通知先設定,
        First(colMySetting),
        {
            ユーザー名: gblCurrentUser.displayName,
            ユーザーUPN: gblCurrentUser.userPrincipalName,
            チーム名: cmbTeamName.Selected.displayName,
            チームID: cmbTeamName.Selected.id,
            チャネル名: cmbChannelName.Selected.displayName,
            チャネルID: cmbChannelName.Selected.id
        }
    );
    
);
If(
     // エラー判定
    !IsEmpty(Errors(通知先設定)),
     // エラーメッセージ
    Notify(
        Concat(
            Errors(通知先設定),
            Column & ": " & Message
        ),
        NotificationType.Error
    ),
     // 成功メッセージ
    Notify(
        "通知先の登録処理が成功しました",
        NotificationType.Success
    );
    ClearCollect(
        colMySetting,
        LookUp(
            通知先設定,
            ユーザーUPN = gblCurrentUser.userPrincipalName
        );
    );
    
);

```

これにより、以下のようなデータが登録されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/dbb69942-1a41-5a45-9ce7-4628a284548c.png)

## 登録した通知先を利用する

### Power Automate 側

Power Automate 側はシンプルです。Power Apps から、通知先のチームの ID やチャネルの ID を受け取るよう引数を設定し、そちらを利用して Teams のチャネルに投稿をするようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/5d8a28f0-88c3-9426-6fd0-95bb3cd47aa4.png)

### Power Apps 側

Power Apps 側で以下のボタンを押した際の処理です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a09f8873-5bb7-a7a1-5aa2-2ee742c194eb.png)


```
Patch(
    勤務状況シェア,
    Defaults(勤務状況シェア),
    {
        日付:Today(),
        ユーザー名: gblCurrentUser.displayName,
        ユーザーメールアドレス: gblCurrentUser.mail,
        働き方: drpPlan.Selected.Value,
        一言: txtMemo.Text,
        スケジュール詳細: rteSheduleDetail.HtmlText
    }
);
UpdateContext(
    {
        locFlowResult: M_勤務状況シェアフロー.Run(
            Text(drpPlan.Selected.Value),
            txtMemo.Text,
            rteSheduleDetail.HtmlText,
            Today(),
            First(colMySetting).チームID,
            First(colMySetting).チャネルID
        )
    }
);
If(
    locFlowResult.result = "0",
    Notify(
        "勤務状況の共有処理が成功しました",
        NotificationType.Success
    );
    Set(
        gblCopyData,
        Blank()
    );
    Reset(drpPlan);
    Reset(txtMemo);
    ,
    Notify(
        "勤務状況の共有処理が失敗しました",
        NotificationType.Error
    );
    
);

```
 
上記では、アプリで使用するデータソースにもデータを登録するなどの処理が含まれていますが、Power Automate との連携部分は以下です。

```
UpdateContext(
    {
        locFlowResult: M_勤務状況シェアフロー.Run(
            Text(drpPlan.Selected.Value),
            txtMemo.Text,
            rteSheduleDetail.HtmlText,
            Today(),
            First(colMySetting).チームID,
            First(colMySetting).チャネルID
        )
    }
);
```

事前に、登録している Teams 通知先の設定情報を以下のような感じで読み込んでおき、その情報を Power Automate に渡しています。

```
  ClearCollect(
        colMySetting,
        LookUp(
            通知先設定,
            ユーザーUPN = gblCurrentUser.userPrincipalName
        );
    );
```