PowerAutomate: Teams メンバーを組織連動で更新させる

# 背景
組織単位での Team を作ってたりしませんか？
そういう場合に、組織のグループで Team が作れていれば、人事異動の際に困らないんですが・・
うちの場合は、組織グループ ≠ Teamsグループ　な為、手動更新が必要です

ってことで、組織グループに追従させる方法です。

# 概要
1. [組織グループのユーザー一覧取得](#組織グループのユーザー一覧取得)
1. [Teams グループのユーザー一覧取得](#teams-グループのユーザー一覧取得)
1. [不足してるユーザーを追加](#不足してるユーザーを追加)
1. [不要なユーザーを削除](#不要なユーザーを削除)

# 全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b2744c50-8aed-4251-6f16-614deb5c62af.png)

:::note warn
- メンバーの取得制限が 999 で、これを超える場合は未考慮
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/3fe48b13-bf12-dc3f-8e9d-03dc94253de9.png)

[グループ メンバーを一覧表示する](https://docs.microsoft.com/ja-jp/connectors/office365groups/#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97-%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%82%92%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)
:::

:::note warn
組織構造をネスト（入れ子）で対処している為、以下の制限がある。
条件(condition) も計数される為、四階層を超える場合は、子フロー化とかの対処が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e34a82d7-5ae0-af22-a8de-5db00be481e9.png)

[フロー定義の制限](https://docs.microsoft.com/ja-jp/power-automate/limits-and-config)

:::

# 詳細
## 組織グループのユーザー一覧取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/13790c79-3427-2db3-c3c1-44050873df38.png)

Teams メンバーはフラットですが、組織メンバーは以下がある為、取得結果を変数で受けられるようにする
- グループユーザー

ということで、まずは組織メンバーの受け皿変数を準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/d3493966-a31f-23de-2a4a-62773d4e106e.png)

- 組織メンバー一覧取得
    - [グループ メンバーを一覧表示する](https://docs.microsoft.com/ja-jp/connectors/office365groups/#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97-%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%82%92%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B) を使って一覧取得
    - Default: 100 なので、変数化しておいて、Team メンバー取得側と同時に設定できるようにするのがお勧め
        - 動作検証する際は小さく、本番動作時は大きく
- 取得した結果をループして、
    - ユーザーの場合には、先ほどの変数に追加
    - 階層組織におけるグループの場合には、同様の処理をネストする

ユーザー判断のプロパティ
> @{items('Apply_to_each_Create_Department_Members')?['@odata.type']}

ユーザーの場合の値
> #microsoft.graph.user

## Teams グループのユーザー一覧取得
Teams メンバーはフラットなので、そのまま取得して利用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/98f564d9-3197-d51d-9e79-06e8cb2bf9c3.png)

## 不足してるユーザーを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/dd7afe69-d7f6-cb7e-29fa-8af6fb8f52ca.png)

- 追加・削除に必要な Team ID を変数に保存
    - メンバー取得の際に対象Team を指定しているので、Team ID(groupId) を利用
> @{actions('List_group_members_Teams_SETTINGS')?['inputs']?['parameters']?['groupId']}

引数の再利用は以下を参考に

https://qiita.com/baku2san/items/6fa63d15198c2a20f61c#body-vs-outputs-vs-actions

- 組織メンバーをループさせて
    - Team メンバーに一致する ID (ユーザー) がいるか？を FilterArray で確認
        - 存在しない場合に、ユーザー追加：[メンバーをグループに追加する](https://docs.microsoft.com/ja-jp/connectors/office365groups/#%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%82%92%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)

存在しない場合の確認方法

> @{empty(body('Filter_array_Teams'))}

追加対象のグループは、カスタム値で保存した Team ID を利用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e6ca8856-82aa-fe77-f8fd-03db88f2a9ee.png)

あとは、動的コンテンツで取れるものばかりなので省略

## 不要なユーザーを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/1e9bdcb1-54a3-4878-0bb9-a541d91443f2.png)

追加との相違点は以下
- ループさせるメンバーが、追加側と逆
- 追加ではなく、[メンバーをグループから削除する](https://docs.microsoft.com/ja-jp/connectors/office365groups/#%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%82%92%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%8B%E3%82%89%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B) を利用

# あとがき
それほど難しくはないので、大きめの組織チームを作った場合には自動化しておくと面倒が無くてよいです。
あとは、差分（追加・削除）時に通知を出すようにしておくと、それに応じた対処がしやすくなりますね

# keyword
how to update team members by security group