ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

【Power Automate】【解説編その1】チームのメンバーを別チームのタグに同期する

掲題のフローについての解説編です。

このフローをGitHubで公開しました。下記リンク先からダウンロードしてください。

github.com

解説の経緯

今回の投稿は概要編の続きです。

フローの使用イメージ

フローの使用イメージについては概要編に記載しています。概要編を未読のかたはそちらを先に参照ください。

フロー図

アクションの設定を閉じた状態のフロー図

このフローで実施している処理の大項目は以下の通りです。

  1. メンバーの取得
    • 同期元のチームメンバー
    • 同期先のチームメンバー
    • 同期先タグ
  2. メンバー差異の取得
    • 同期元チームにいて、かつ、同期先チームにいないメンバー
    • 同期元チームにいなくて、かつ、同期先チームにいるメンバー
    • 同期元チームいて、かつ、タグにいないメンバー
    • 同期元チームいなくて、かつ、タグにいるメンバー
  3. 同期先チームおよびタグのメンバー追加・削除

「解説編その1」で解説する範囲

「解説編その1」解説する範囲は黄色マーカーをひいている範囲です。

メンバーの取得について今回は解説します。

  1. メンバーの取得
    • 同期元のチームメンバー
    • 同期先のチームメンバー
    • 同期先タグ
  2. メンバー差異の取得
    • 同期元チームにいて、かつ、同期先チームにいないメンバー
    • 同期元チームにいなくて、かつ、同期先チームにいるメンバー
    • 同期元チームいて、かつ、タグにいないメンバー
    • 同期元チームいなくて、かつ、タグにいるメンバー
  3. 同期先チームおよびタグのメンバー追加・削除

ステップごとの解説

「グループ メンバーが追加または削除されたとき」トリガー

このトリガーは「Office 365 Groups」>「グループ メンバーが追加または削除されたとき」です。同期元のチームをトリガーの対象とします。

ポイントになるのは追加(または削除)されたメンバーが誰であるかという情報はこのフローでは使用しない点です。

このフローを実行すると、トリガーとなったメンバー追加(または削除)がなんであるかに関わらずフロー完了時に同期元チームと同期先チームタグのメンバーが一致するように同期先に対してメンバーの追加・削除を行います。

また、同期元チームのメンバーを削除した場合は同期先タグから同メンバーの削除を行いますが、同期先チームからの削除は行わないようにしています。

「作成-同期先のタグがあるチームのID」アクション

このアクションは「データ操作」>「作成」です。同期先のチームを指定します。

表示名ではなくIDを指定している理由は、チームの表示名は重複することがあるためです。

チームIDはTeamsのデスクトップアプリやブラウザで確認することができます。

参考:

auto-worker.com

「作成-タグの名前」アクション

このアクションは「データ操作」>「作成」です。同期先のタグの名前を指定します。

同じチーム内でタグの名前は重複しないため、表示名で指定するようにしています。

「スコープ-同期元のチームメンバーを取得」アクション

このアクションは「コントロール」>「スコープ」です。同期元のメンバーをすべて取得します。

このスコープに含まれるアクション(= チームのタグの取得に関わるアクション)は下図のふたつです。

「グループ メンバーの一覧表示-同期元チーム」アクション

このアクションは「Office 365 Groups」>「グループ メンバーの一覧表示」です。このアクションでチームメンバーをすべて取得します。

"parameters": {
    "groupId": "@trigger()?['inputs']?['parameters']?['groupId']"
},

ここで指定しているグループIDはトリガーのインプットで指定しているグループIDです。ポイントはトリガーのインプットは関数で取得することができることです。

これについてはHiroさんのブログ記事で解説されています。

参考:mofumofupower.hatenablog.com

このアクションの出力はチームメンバーの一覧です。

「選択-同期元チームに含まれるメンバー」アクション

このアクションは「データ操作」>「選択」です。前述の一覧取得アクションから受け取ったデータをフロー後半の処理で使いやすいように整形します。

"inputs": {
    "from": "@outputs('グループ_メンバーの一覧表示-同期元チーム')?['body/value']",
    "select": {
        "userId": "@item()?['id']",
        "displayName": "@item()?['displayName']"
    }
},

グループメンバーの取得アクションから受け取った、ユーザーIDを表す「ID」というプロパティがあります。

後続の処理で「ユーザーID」と「タグID」がでてきますため、どちらを指すものか明確になるようにこの「選択」アクションで「userId」というプロパティ名を付けています。

このアクションの出力はこちらです。

「スコープ-同期先のチームメンバーを取得」アクション

このアクションは「コントロール」>「スコープ」です。同期先チームのメンバーをすべて取得します。

同期先チームのメンバーをすべて取得する理由は、タグに追加したいメンバーがそもそもチームのメンバーであるかを確認するためです。

このフローではタグに追加したいメンバーが同期先チームのメンバーでない場合に、タグへの追加の前にチームメンバーへの追加を行っています。

このスコープに含まれるアクション(= チームのタグの取得に関わるアクション)は下図のふたつです。

「グループ メンバーの一覧表示-同期先チーム」アクション

このアクションは「Office 365 Groups」>「グループ メンバーの一覧表示」です。今度は同期先チームのメンバーを取得します。

"parameters": {
    "groupId": "@outputs('作成-同期先のタグがあるチームのID')"
},

このアクションの出力はこちらです。

「選択-同期先チームに含まれるメンバー」アクション

このアクションは「データ操作」>「選択」です。同期元チームと同様に、一覧取得アクションで取得したデータを整形します。

"inputs": {
    "from": "@outputs('グループ_メンバーの一覧表示-同期先チーム')?['body/value']",
    "select": {
        "userId": "@item()?['id']",
        "displayName": "@item()?['displayName']"
    }
},

このアクションの出力はこちらです。

「スコープ-同期先タグに含まれるメンバーを取得」アクション

このアクションは「コントロール」>「スコープ」です。タグに含まれているメンバーの取得を行います。

このスコープに含まれるアクション(= チームのタグの取得に関わるアクション)は下図の通り5つです。

「チームのタグをすべて一覧表示する」アクション

このアクションは「Microsoft Teams」>「チームのタグをすべて一覧表示する」です。同期先チームにあるタグをすべて取得します。

"parameters": {
    "groupId": "@outputs('作成-同期先のタグがあるチームのID')"
},

Teams コネクタにはタグの名前やIDを指定してタグを取得するアクションがありません。そのため、このフローではチームにあるすべてのタグを取得するアクションを使ったのちに目的のタグをフィルタ取得する方法をとっています。

このアクションの出力はこちらです。

「アレイのフィルター処理」アクション

このアクションは「データ操作」>「アレイのフィルター処理」です。前述のアクションで取得したタグ一覧から目的のタグをフィルタして取得します。

"inputs": {
    "from": "@outputs('チームのタグをすべて一覧表示する')?['body/value']",
    "where": "@equals(item()?['displayName'], outputs('作成-タグの名前'))"
}

このアクションの出力はこちらです。これで目的のタグが取得できました。

「作成-タグID」アクション

このアクションは「データ操作」>「作成」です。前述のフィルタアクションから受け取った配列にあるタグIDを取得します。

"inputs": "@first(body('アレイのフィルター処理'))?['Id']",

first関数を使って配列から要素を取得しているところもポイントです。タグの名前は重複することはないため、フィルタアクションが出力する配列の要素の個数はかならずひとつです。そのため、first関数で目的の要素を取得することができます。
このアクションの出力はこちらです。目的のタグIDがとれました。

「タグのメンバーを一覧表示する」アクション

このアクションは「Microsoft Teams」>「タグのメンバーを一覧表示する」です。タグIDをこのアクションに渡してメンバー一覧を取得します。

"parameters": {
    "groupId": "@outputs('作成-同期先のタグがあるチームのID')",
    "tagId": "@outputs('作成-タグID')"
},

このアクションの出力はこちらです。

「選択-タグに含まれるメンバー」アクション

このアクションは「データ操作」>「選択」です。チームのメンバー一覧を取得したときと同様にタグのメンバー一覧についても後続の処理で比較を行いやすいように整形します。

"inputs": {
    "from": "@outputs('タグのメンバーを一覧表示する')?['body/value']",
    "select": {
        "userId": "@item()?['userId']",
        "displayName": "@item()?['displayName']"
    }
},

このアクションの出力はこちらです。

最後に

今回はメンバーの取得について解説を行いました。

次回「解説編その2」では、メンバー差異の取得について解説します。

  1. メンバーの取得(今回解説した範囲)
    • 同期元のチームメンバー
    • 同期先のチームメンバー
    • 同期先タグ
  2. メンバー差異の取得
    • 同期元チームにいて、かつ、同期先チームにいないメンバー
    • 同期元チームにいなくて、かつ、同期先チームにいるメンバー
    • 同期元チームいて、かつ、タグにいないメンバ
    • 同期元チームいなくて、かつ、タグにいるメンバ
  3. 同期先チームおよびタグのメンバー追加・削除

今回は以上です。

追記:「解説編その2」を投稿しました。

wataruf.hatenablog.com