掲題のフローについての解説編です。
このフローをGitHubで公開しました。下記リンク先からダウンロードしてください。
解説の経緯
フローの使用イメージ
フローの使用イメージについては概要編に記載しています。概要編を未読のかたはそちらを先に参照ください。
フロー図
アクションの設定を閉じた状態のフロー図
このフローで実施している処理の大項目は以下の通りです。
- メンバーの取得
- 同期元のチームメンバー
- 同期先のチームメンバー
- 同期先タグ
- メンバー差異の取得
- 同期元チームにいて、かつ、同期先チームにいないメンバー
- 同期元チームにいなくて、かつ、同期先チームにいるメンバー
- 同期元チームいて、かつ、タグにいないメンバー
- 同期元チームいなくて、かつ、タグにいるメンバー
- 同期先チームおよびタグのメンバー追加・削除
「解説編その3」で解説する範囲
「解説編その3」解説する範囲は黄色マーカーをひいている範囲です。
同期先チームおよびタグのメンバー追加・削除について今回は解説します。
- メンバーの取得
- 同期元のチームメンバー
- 同期先のチームメンバー
- 同期先タグ
- メンバー差異の取得
- 同期元チームにいて、かつ、同期先チームにいないメンバー
- 同期元チームにいなくて、かつ、同期先チームにいるメンバー
- 同期元チームいて、かつ、タグにいないメンバー
- 同期元チームいなくて、かつ、タグにいるメンバー
- 同期先チームおよびタグのメンバー追加・削除
ステップごとの解説
「Apply to each-同期先チームにメンバーを追加」アクション
このアクションは「コントロール」>「それぞれに適用する」です。タグに登録したいメンバーをまずはチームに登録します。
これに含まれるアクションは下図の通りです。
この繰り返し処理で使用するインデクサは解説編その2で取得した配列です。
この配列の中身は下図の通りです。
「チームにメンバーを追加する」アクション
このアクションは「Microsoft Teams」>「チームにメンバーを追加する」です。
"parameters": { "teamId": "@outputs('作成-同期先のタグがあるチームのID')", "body/userId": "@items('Apply_to_each-同期先チームにメンバーを追加')?['userId']", "body/owner": false },
これでチームへのメンバー追加ができました。
「Apply to each-不足しているメンバーをタグに追加」アクション
このアクションは「コントロール」>「それぞれに適用する」です。タグにメンバーを追加します。
これに含まれるアクションは下図の通りです。
この繰り返し処理で使用するインデクサも解説編その2で取得した配列です。
この配列の中身は下図の通りです。
「タグにメンバーを追加する」アクション
このアクションは「Microsoft Teams」>「タグにメンバーを追加する」です。
"parameters": { "groupId": "@outputs('作成-同期先のタグがあるチームのID')", "tagId": "@outputs('作成-タグID')", "body/userId": "@items('Apply_to_each-不足しているメンバーをタグに追加')?['userId']" },
これでタグへのメンバー追加ができました。
「Apply to each-不要なメンバーをタグから削除」アクション
このアクションは「コントロール」>「それぞれに適用する」です。同期元チームにいなくて、かつ、タグにいるメンバーをタグから削除します。
これに含まれるアクションは下図の通りです。
この繰り返し処理で使用するインデクサも解説編その2で取得した配列です。
この配列の中身は下図の通りです。
「アレイのフィルター処理-タグ内のメンバー一覧から削除対象ユーザーを取得」アクション
このアクションは「データ操作」>「アレイのフィルター処理」です。
"inputs": { "from": "@outputs('タグのメンバーを一覧表示する')?['body/value']", "where": "@equals(item()?['userId'], items('Apply_to_each-不要なメンバーをタグから削除')?['userId'])" },
このアクションを使って、タグから削除する対象メンバーの情報をタグのメンバー一覧から取得します。
なぜそんなことをする必要があるのでしょうか?その理由は、タグ内のメンバーを削除するためにはそのユーザーを表す「タグ固有のメンバーID」で指定する必要があり、かつ、繰り返し処理のインデクサとして使用している配列には「タグ固有のメンバーID」が無いためです。
インデクサとして使用する配列(通常のユーザーIDはあるがタグ固有のメンバーIDが無い)
タグに含まれるメンバー一覧の配列(通常のユーザーIDもタグ固有のメンバーIDもある)
※この配列は解説編その1で取得しています。
今回のフィルターアレイアクションの出力はこちらです。削除したいメンバーに紐づくIDを取得することができました。
なぜ、解説編その2の範囲ではなくてこのタイミングでこのIDを取得するのか?その理由は解説編その2の範囲の目的がチームやタグに含まれるメンバー一覧の差異を取得することであるためです。
フィルターアレイのアクションを使って差異を取得するために比較対象の配列が持つプロパティが同じである必要があります。そのため、そのタイミングではタグ特有のプロパティである「タグ固有のメンバーID」を配列に含ませるわけにはいきません。そのため、配列の比較結果が出たあとに「タグ固有のメンバーID」の情報を取得しています。
「タグからメンバーを削除する」アクション
このアクションは「Microsoft Teams」>「タグからメンバーを削除する」です。前述のアクションで取得した「タグ固有のメンバーID」を使ってタグからメンバーを削除します。
"parameters": { "groupId": "@outputs('作成-同期先のタグがあるチームのID')", "tagId": "@outputs('作成-タグID')", "tagMemberId": "@first(body('アレイのフィルター処理-タグ内のメンバー一覧から削除対象ユーザーを取得'))?['id']" },
これでタグからのメンバー削除ができした。
最後に
今回のフローはTwitter で頂いた要望から思い立って作りました。活用していただけると幸いです。(∩´∀`)∩
PowerAutomateで同名のタグとチーム間でメンバーを同期させられたら面白そうですね。
— Sasami (ささみ) (@sasami_axis) May 26, 2023
わたるふさんのブログに載ってる技の組み合わせで実現できそう('ω')
実現しました。
(*'ω'*)
これで今回のフローについての投稿は終了です。