🎠

Teams のタグのメンバー管理を Power Automate と Excel を使って自動化する方法

に公開

はじめに

Teams のチームタグの管理を Power Automate を使って自動化したので、手順を記録します。
Teamsの大規模なチームでは、タグの作成や編集をメンバーに任せると、管理が難しくなります。
タグの乱立、改変、放置のほか、後出の制限事項に抵触することも想定されます。
一方で、タグの管理権限をチーム所有者に限定すると、チーム所有者に負担が集中します。
そのような場面で、この自動化を行うことで、チーム所有者の負担を軽減することができます。
https://learn.microsoft.com/ja-jp/microsoftteams/limits-specifications-teams#tags

事前準備

SharePoint 又は OneDrive の任意のフォルダーに Excel ファイルを格納します。
今回は、SharePoint のドキュメントに「タグ管理」フォルダーを作成して格納します。
なお、Excel ファイルの名前は、Teams のタグの名前になります。

タグ管理フォルダーの画像

Excelファイルは、「タグ管理」テーブルを設定し、「メールアドレス」列を作ります。
メールアドレスの対象者が、タグのメンバーになります。
タグの上限(200名)に合わせて、テーブルの範囲は、201行目までとします。

テーブルの画像

フローの作成手順

手順 内容
チームの情報を取得
タグ名とタグIDの辞書を作成
Excelファイルの数だけ、手順4~7を繰り返す
Excelファイルを読み取る
タグに設定する者を特定する
既存のタグがある場合の処理
既存のタグがない場合の処理

1. チームの情報を取得

任意のトリガーを配置し、フローを開始します。スケジュール実行がおすすめです。
続けて、以下の手順により、タグの管理を行うチームの情報を取得します。

内容 画像
Teams コネクタの「チームの取得」で情報を取得します。 チームの取得の画像
office 365 グループコネクタの「HTTP 要求 V2 を送信する」でチームのメンバーを取得します。 HTTP 要求 V2 を送信するの画像1
office 365 グループコネクタの「HTTP 要求 V2 を送信する」でチームの所有者を取得します。 HTTP 要求 V2 を送信するの画像2
データ操作の「作成」を用い、union関数によって、メンバーと所有者の重複を削除したチーム全員の配列を作ります。 データ操作の作成の画像

https://learn.microsoft.com/ja-jp/graph/api/group-list-members?view=graph-rest-1.0&tabs=http
https://learn.microsoft.com/ja-jp/graph/api/group-list-owners?view=graph-rest-1.0&tabs=http
https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#union

2. タグ名とタグIDの辞書を作成

後続の処理をスムーズに行うため、既存のタグ名とタグIDの辞書を作成します。
Teams コネクタの「チームのタグをすべて一覧表示する」で既存のタグの情報を取得します。

チームのタグをすべて一覧表示の画像

次に、データ操作の「選択」により、取得した情報から、タグ名とタグIDを取り出します。

データ操作の選択の画像
項目 パラメーター(参考)
From range(0,length(outputs('チームのタグをすべて一覧表示する')?['body/value']))
Map左 outputs('チームのタグをすべて一覧表示する')?['body/value']?[item()]?['displayName']
Map右 outputs('チームのタグをすべて一覧表示する')?['body/value']?[item()]?['id']

続けて、データ操作の「作成」を配置し、join関数とreplace関数により、タグ名とタグIDの組合せをカンマ区切りの文字列に変えます。

データ操作の作成の画像
項目 パラメーター(参考)
入力 replace(replace(join(body('選択:タグ名とID'),','),'{',''),'}','')

最後に、データ操作の「作成」を配置し、json関数とconcat関数により、タグ名とタグIDの辞書を作ります。

データ操作の作成の画像
項目 パラメーター(参考)
入力 json(concat('{',outputs('作成:タグ結合'),'}'))

3. Excelファイルの数だけ、手順4~7を繰り返す

事前準備でセットした Excel ファイル1件につき、1つのタグの管理を行います。
まずは、SharePoint コネクタの「フォルダーの一覧」により、「タグ管理」フォルダーに格納されているファイルの情報を取得します。

フォルダーの一覧の画像

続けて、Excelファイルの数だけ、後続の手順を繰り返すため、コントロールの「それぞれに適用する」を配置します。手順4以降のアクションは、このフレームの中に配置します。

それぞれに適用する画像

4. Excelファイルを読み取る

事前準備のとおり、Excel ファイルの名前を Teams のタグの名前にします。
データ操作の「作成」を使用し、タグの名前を作ります。

データ操作の作成の画像
項目 パラメーター(参考)
入力 replace(item()?['Name'],'.xlsx','')

次に、Excelファイルの「タグ管理」テーブルのデータを読み取ります。
Excel Online (Bussiness) コネクタの「表内に存在する行の一覧表示」を配置します。
フィルタークエリを使い、メールアドレスが空欄ではない行を取得します。

表内に存在する行の一覧表示の画像
項目 パラメーター(参考)
Path items('全てのExcelファイルに適用')?['Path']
フィルター クエリ メールアドレス ne ''

https://learn.microsoft.com/ja-jp/graph/filter-query-parameter?tabs=http

5. タグに設定する者を特定する

手順1で作成したチーム全員の配列と Excel のデータを照らし合わせて、タグに設定する対象者を特定します。まずは、データ操作「選択」を配置し、読み取った Excel のデータから、メールアドレスのみを取り出して配列を作ります。

データ操作の選択の画像
項目 パラメーター(参考)
From range(0,length(outputs('表内に存在する行を一覧表示')?['body/value']))
Map outputs('表内に存在する行を一覧表示')?['body/value'][item()]?['メールアドレス']

次に、データ操作「アレイのフィルター」を使用し、チーム全員の配列から、直前で作成したメールアドレスの配列にヒットする者を抽出します。

データ操作のアレイのフィルターの画像
項目 パラメーター(参考)
From outputs('作成:チーム全員')
Filter Query 左 body('選択:メールアドレス')
Filter Query 中 contains
Filter Query 右 item()?['mail']

最後に、フィルターの結果から、タグに設定する対象者のユーザーIDを取り出します。
データ操作「選択」を配置し、ユーザーIDの配列を作成します。

データ操作の選択の画像
項目 パラメーター(参考)
From range(0,length(body('アレイのフィルター処理:タグ設定対象者')))
Map body('アレイのフィルター処理:タグ設定対象者')?[item()]?['id']

6. 既存のタグがある場合の処理

(1)タグの有無を確認

既存のタグがある場合、タグメンバーの修正を行います。
手順2で作成したタグの辞書に、手順4で取得したタグ名が含まれているか、確認します。

条件分岐の画像
項目 パラメーター(参考)
条件:左 contains(outputs('作成:タグ辞書'),outputs('作成:タグ名'))
条件:中 is equal to
条件:右 true

(2)タグメンバー情報を取得

Teams コネクタの「タグのメンバーを一覧表示する」により、タグメンバー情報を取得します。
注意点として、タグの項目は、タグのIDを設定する必要があるため、辞書から取り出して設定します。

タグのメンバーを一覧表示の画像
項目 パラメーター(参考)
タグ outputs('作成:タグ辞書')?[outputs('作成:タグ名')]

タグメンバー情報には、タグ固有のタグメンバーIDと、ユーザーIDが含まれます。
手順5で取得したタグの設定対象者との差分の確認には、ユーザーIDの情報が必要です。
データ操作「選択」を配置し、タグメンバー情報から、ユーザーIDの配列を作成します。

データ操作の選択の画像
項目 パラメーター(参考)
From range(0,length(outputs('タグのメンバーを一覧表示する')?['body/value']))
Map outputs('タグのメンバーを一覧表示する')?['body/value']?[item()]?['userId']

(3)タグメンバーの追加

手順5のタグの設定対象者が、タグメンバーにいない場合、タグへの追加対象とします。
データ操作「アレイのフィルター」を使用し、追加対象を抽出します。

データ操作のアレイのフィルターの画像
項目 パラメーター(参考)
From body('アレイのフィルター処理:タグ設定対象者')
Filter Query 左 contains(body('選択:タグメンバーUserId配列'),item()?['id'])
Filter Query 中 is equal to
Filter Query 右 false

前工程で抽出した追加対象をタグに追加します。
Teamsコネクタの「タグにメンバーを追加する」を配置し、全員分、繰り返し追加します。

タグにメンバーを追加の画像

(4)タグメンバーの削除

手順5のタグの設定対象者に含まれていないタグメンバーは、タグからの削除対象とします。
データ操作「アレイのフィルター」を使用し、削除対象を抽出します。

データ操作のアレイのフィルターの画像
項目 パラメーター(参考)
From outputs('タグのメンバーを一覧表示する')?['body/value']
Filter Query 左 contains(body('選択:タグ設定対象者ID配列'),item()?['userId'])
Filter Query 中 is equal to
Filter Query 右 false

前工程で抽出した削除対象をタグから削除します。
Teamsコネクタの「タグからメンバーを削除する」を配置し、全員分、繰り返し追加します。
注意点として、このアクションでは、ユーザーIDではなく、タグメンバーIDを指定します。

タグからメンバーを削除の画像

7. 既存のタグがない場合の処理

既存のタグがないときは、新しいタグを作ります。
まずは、既存のタグがないこと、タグの設定対象者が1名以上いることを確認します。

条件分岐の画像
項目 パラメーター(参考)
条件1:左 contains(outputs('作成:タグ辞書'),outputs('作成:タグ名'))
条件1:中 is equal to
条件1:右 false
条件2:左 length(body('選択:タグ設定対象者ID配列'))
条件2:中 is greater or equal to
条件2:右 1

最後に、タグを作成します。
Teams コネクタの「チームのタグを作成する」を配置します。
メンバーのIDは、セミコロンで結合し、まとめてセットすることができます。

チームのタグを作成の画像
項目 パラメーター(参考)
メンバーのID join(body('選択:タグ設定対象者ID配列'),';')

以上でフローの作成は完了です。

参考

このフローでは、タグメンバーの追加、削除の繰り返し処理により、Power Platform 要求 (PPR)を大きく消費するため、フローを実行するライセンスのPPR上限に注意する必要があります。

https://learn.microsoft.com/ja-jp/power-platform/admin/api-request-limits-allocations

何が Power Platform 要求と見なされますか?
だれの Power Platform 要求制限がクラウド フローで使用されますか?

https://learn.microsoft.com/ja-jp/power-platform/admin/power-automate-licensing/faqs#what-counts-as-power-platform-request

Discussion