PowerAutomateでワークフローを構築・運用していると、時折、自組織のメンバーを一覧したいことがあります。
今回はそのようなシーンでのソリューションのご紹介です。
Problem
ワークフローを構築・運用しているうち何かしらの目的で自組織のメンバーの一覧が必要になった。
あるメンバー(マネージャー等)を頂点に、その配下のメンバーを再帰的に探索して一覧したい。
「Office 365 Users」コネクターの「直属の部下の取得」アクションでは、文字通りあるメンバー(マネージャー等)の直属メンバーの一覧しかえられない:
Solution
「直属の部下の取得」アクションと「Do Until」アクションを組合せて、再帰的なメンバー探索を行います。
成果物の容れ物を準備
まずは、下準備。
「直属の部下の取得」アクションの対象となるユーザーたちを一時的に格納するキュー(配列)を作成します:
探索の起点を決める
「ユーザープロフィールの取得」アクションで、再帰的探索の起点となるユーザーのプロフィール情報を取得し、キューにプッシュ(配列に追加)します:
再帰的な探索を開始する
いよいよ「Do Until」の登場です。終了条件は length(variables('memberQueue'))
== 0
とします:
必須の操作ではありませんが、このあとの作業(式の記述)を少しでも簡単にするため、「作成」アクションを使い、あらかじめキューの先頭の要素を取り出します。入力は variables('memberQueue')[0]
です:
今しがた取り出したユーザーのプロフィールを取得します。また今回は当該ユーザーの上司の情報もセットで管理したい(非正規化したい)ので、「上司の取得」アクションも実行します:
取得したユーザー(0~N件)を次回以降の探索対象としてキュー(配列)に追加しましょう。
キューの先頭要素(先ほど処理済み)を除く要素からなる配列を作成し、それと「直属の部下の取得」で取得した配列とまとめます。「作成」アクションの入力はこんなかんじ:
union(skip(variables('memberQueue'), 1), outputs('直属の部下の取得_(V2)')?['body/value'])
:
ここでは「直属の部下の取得」で取得したユーザーをすべてキューに追加しています。
しかし、ユーザーの属性(例えば jobTitle
)などで「当該ユーザーに部下はいない」あるいは「当該ユーザーの部下の探索は不要」と判断できる場合もあるでしょう。その場合は「直属の部下の取得」の出力に対して「アレイのフィルター処理」による選別を行なうことで、不要な探索処理をスキップできます。
実際、私が職場で運用しているワークフローでは jobTitle
によりマネージャー(部下がいる)とそれ以外(部下がいない)を分け、マネージャーは先程示した通りキュー(variables('memberQueue')
)に追加する一方、メンバーは即座に探索結果を保管するリスト(variables('memberResult')
)に追加しています:
ワークフローを実行する
あとはフローを実行するだけです。
少々時間がかかってしまいますが、起点となるユーザーから順次組織構造の下方に向かって再帰的な探索が行われていき、結果が配列に格納されていきます。
もちろん、成果物をどうやって保管するのかは目的次第です。私の場合はSharePointサイト上のExcelファイルのテーブルと、同じくサイト上のJSONファイルとしてデータを書き出しておき、別のワークフローから利用しています。