今回はPowerAutomateでフローを作成中に遭遇した困難のトラブルシューティングです。
PowerAutomateのフロー内で、ExcelやSharePointリストなど様々なデータソースから取得したオブジェクトの配列に対して、特定のキー項目を条件に重複を削除したい(ユニークな要素からなる配列を得たい)ことがあります。
しかしこれが案外簡単には行きません。。
Problem
オブジェクトの配列に対して、特定のキー項目を条件に重複を削除したいが、用意されている関数でこれを実現するものがない。
文字列や数値、真偽値の配列であれば、union(<重複削除したい配列>, json('[]'))
で済みます。
しかしオブジェクトの配列を特定のキー項目を条件に重複削除したいとなるとこの方法では対応できません。
Solution
アクションと関数を組み合わせて少し複雑なフローを作って対処します。
まずは元データですが、今回は説明のために「作成」アクションでデータを作りました。実際にはExcelやSharePointからデータを取ってくるアクションを使うことになるでしょう:
今回はこのオブジェクト配列に対して、projectNo
とreviewer
をキーにして重複削除を行ってみます。
前述の通りこのままでは union(...)
関数を使えないので、キー情報を連結した文字列からなる配列に変換します:
- From:
outputs('作成_records')
- Map:
concat(string(item()['projectNo']), '★', item()['reviewer'])
そして、union(...)
関数を使ったテクニックを適用します:
- Inputs:
union(body('選択_keys(projectNo★reviewer)'), json('[]'))
このままではキーが連結された状態のままなので、分離(復元)します:
- From:
outputs('作成_uniqueKeys')
- Map:
- projectNo:
int(split(item(),'★')[0])
- reviewer:
split(item(), '★')[1]
- projectNo:
これで重複削除した配列ができあがります。
重複していた要素の件数も知りたい場合
ここで、もし「重複していた要素の件数も知りたい」ということになると、もう少し複雑になります。
まずはこのあと重複削除&重複カウントをする上で使用する変数を初期化します:
先ほど登場した「作成_uniqueKeys」アクションの出力を使ってループを行います:
- Select an output from previous steps:
outputs('作成_uniqueKeys')
ループの中で、「選択 keys(projectNo★reviewer)」アクションの出力、つまり重複削除前の配列をフィルターします。フィルター条件は「作成_uniqueKeys」アクションの出力(のループ処理中の現在の要素)です:
- From:
body('選択_keys(projectNo★reviewer)')
- 左辺:
item()
※フィルターの現在の要素 - 右辺:
items('Apply_to_each_uniqueKeys')
※ループの現在の要素
このフィルター結果を活用しながらオブジェクトを作成します:
- Inputs:
- projectNo:
int(split(item(),'★')[0])
- reviewer:
split(item(), '★')[1]
※文字列なので「Inputs」の入力欄に記載するとき前後に"
が必要 - count:
length(body('Filter_array_keys'))
- projectNo:
作成したオブジェクトを先ほど初期化した配列に追加します:
これで件数もわかるようになりました。