【Teams×Power Automate】Teamsチームのタグは便利だがネストできない、こうして解決した
目次
はじめに
プロジェクトでTeamsのチームを使っています。プロジェクトの中には複数のチーム(作業グループ)があり、それぞれがTeamsのタグを作って、メンションに使っています。「@開発チーム」とすれば、開発チームのメンバー全員に通知が届く、あれです。
便利なのですが、困るのが全チームに一斉に連絡したいときです。各チームのタグをまとめた「PJ全メンバー」タグがほしくなります。ところが、Teamsのタグには、タグの中にタグを入れる(ネストする)機能がありません。

Microsoftの公式ドキュメントでも、タグに入れられるのはチームのメンバー(人)だけです。タグのメンバーを表すデータも「タグが付けられたユーザー」と定義されていて、ほかのタグやグループを入れる項目はありません。
- Microsoft Teams でタグを管理する - Microsoft Learn(1チームにタグは200個まで、1つのタグにメンバーは200人まで)
- teamworkTagMember リソースの種類 - Microsoft Graph(タグのメンバーは「タグが付けられた、チーム内のユーザー」)
そこで、Power Automateで「PJ全メンバー」タグを自動でメンテナンスすることにしました。
抱えていた課題
- タグをネストできない: 「PJ全メンバー」タグに、各チームのタグをそのまま入れることができません。
- 手でメンバーを二重管理するのは無理がある: 各チームのタグとは別に、全メンバータグにも同じ人を手で登録すると、入退場のたびに更新漏れが起きます。
- 全チームへの連絡がメンションの羅列になる: 「@Aチーム @Bチーム @Cチーム …」と毎回全部書く必要があり、書き漏れも起きます。
作った仕組みの概要
考え方はシンプルです。
各チームのタグのメンバーを集めて、「PJ全メンバー」タグと突き合わせ、足りない人を追加し、余分な人を削除する。 これをPower Automateで定期的に実行します。
フローは大きく次の流れです。

1. 定期実行して、集めたいタグのIDを用意する

トリガーは「繰り返し」です。1日1回など、定期的に動かします。
メンバーを集めたい各チームのタグは、タグIDをあらかじめ調べてアレイ変数(連絡網タグIDのリスト)に入れておきます。タグIDは「チームのタグをすべて一覧表示する」アクションを一度動かせば、実行履歴の出力で確認できます。
タグ名で探す方法もありますが、名前は変わることがあるので、IDで固定しておくほうが安心です。
2. タグIDの数だけループして、メンバーを集める

タグIDのリストでループし、「チーム タグのメンバーを一覧表示する」でタグごとのメンバーを取得します。
取得結果(value)をさらにループして、ユーザーIDを配列変数(連絡網タグのユーザ)に追加していきます。
3. 重複をなくす

一人が複数のチームに所属していることもあるので、集めたユーザーIDには重複が出ます。
そこで「作成」アクションで union() を使って重複をなくします。同じ配列同士を union() すると、重複を除いた配列が得られます。
union(variables('連絡網タグのユーザ'), variables('連絡網タグのユーザ'))
これで「本来PJ全メンバータグにいるべき人」のリストができました。
4. PJ全メンバータグの、今のメンバーを確認する

次に、更新先である「PJ全メンバー」タグに、今だれが登録されているかを取得します。
「チーム タグのメンバーを一覧表示する」で全メンバータグを指定し、ユーザーIDを配列変数(ALL連絡網タグのユーザ)に入れておきます。
5. 追加すべき人・削除すべき人を抽出する

ここがこのフローの肝です。「アレイのフィルター処理」を2つ使って、差分を出します。
- 追加ユーザ: 手順3のリスト(いるべき人)のうち、全メンバータグに含まれていない人
- 削除ユーザ: 全メンバータグの今のメンバーのうち、手順3のリストに含まれていない人

条件はどちらも「次の値を含まない」です。比較する向きを逆にするだけで、追加と削除の両方が出せます。
6. 削除すべき人をタグから削除する

削除ユーザでループし、「メンバーをチーム タグから削除する」を実行します。
注意点:このアクションで指定するのは「タグ メンバー ID」です。ユーザーIDではありません。図のように items('Apply_to_each(タグユーザ削除)')?['id'] と、タグメンバー一覧で取れる id を渡します。ここを取り違えると削除に失敗します。
削除の成功・失敗は、それぞれ別の配列変数に表示名を貯めておきます(失敗側は「実行条件の構成」で、前のアクションが失敗したときに動くようにしています)。あとで結果を確認するのに便利です。
7. 追加すべき人をタグに追加する

最後に、追加ユーザでループして「チーム タグにメンバーを追加する」を実行します。
こちらで指定するのは「ユーザーの ID」です(items('Apply_to_each(タグユーザ追加)')?['userId'])。追加はユーザーID、削除はタグメンバーIDと、求められるIDが違う点に気をつけてください。
削除と同じく、成功・失敗したユーザーの表示名を配列に貯めておきます。
注意点:1つのタグに入れられるのは200人まで

Teamsのタグには上限があり、1つのタグに割り当てられるメンバーは200人までです。PJ全メンバーが200人を超えると、この仕組みは手順7の追加の段階で失敗します。
大きなプロジェクトで使う場合は、事前に人数を確認しておいてください。手順7で貯めている「追加失敗ユーザ」を見れば、上限に引っかかったかどうかにも気づけます。
参考:Microsoft Teams でタグを管理する - Microsoft Learn(1チームにタグは200個まで、1つのタグにメンバーは200人まで、1人に付けられるタグは25個まで)
得られたメリット
ひとつのメンションで全チームに届く

「@PJ全メンバー」とメンションするだけで、全チームのメンバーに通知が届くようになりました。チームのタグを並べる必要も、書き漏れの心配もありません。
各チームは自分のタグだけメンテすればよい
メンバーの入れ替えがあっても、各チームは自分たちのタグを更新するだけです。PJ全メンバータグは、次の定期実行で自動的に追いつきます。二重管理がなくなりました。
退場した人も自動で外れる
追加だけでなく削除もしているので、チームのタグから外れた人は、PJ全メンバータグからも自動で外れます。抜けた人に連絡が届き続ける、ということがありません。
まとめ
Teamsのタグはネストできませんが、「各タグのメンバーを集めて、まとめ用のタグと差分を取り、追加・削除する」 というフローを定期実行すれば、実質的にネストしたのと同じ状態を作れます。
ポイントは次の3つです。
1.集めたメンバーは union() で重複をなくす。
2.「アレイのフィルター処理」の「次の値を含まない」で、追加すべき人・削除すべき人を出す。
3.タグへの追加はユーザーID、タグからの削除はタグメンバーIDを指定する。
タグが増えたときは、手順1のタグIDのリストに1行足すだけです。同じ悩みを持っている方の参考になればうれしいです。