Power Automateの選択(Select)アクション。配列から必要な列だけを取り出す整形術

Power Automateの選択(Select)アクションは、配列の中から必要な列だけを取り出して整形するためのアクションです。Apply to eachを使わずに配列を変換できるので、フローをシンプルに保てます。

選択(Select)アクションとは

配列の列を絞り込むアクション

SharePointリストから取得したアイテムやHTTPリクエストで受け取ったJSONには、不要な列が大量に含まれていることがよくあります。そのままTeamsに通知したり別のシステムに送ったりすると、必要な情報が埋もれて見づらくなります。

選択(Select)アクションは、配列の各要素から必要なプロパティだけを取り出し、新しい配列に整形します。Excelの列選択に近い感覚で使えます。データ加工アクションの一覧はPower Automate入門の全体マップで整理しています。

Filter arrayとの違い

似た名前のアクションにFilter arrayがありますが、役割は明確に異なります。

アクション目的結果
選択(Select)列(プロパティ)を絞り込む全行を残して列だけ変換
アレイのフィルター処理(Filter Array)行(レコード)を絞り込む条件に合う行だけ残す

選択(Select)は行数を変えず列を変換する、アレイのフィルター処理(Filter Array)は列を変えず行を絞り込む。この使い分けを最初に押さえておくと、組み合わせて使うときに迷いません。

選択(Select)アクションの基本的な使い方

アクションの追加と設定

フローに選択(Select)アクションを追加するときは、データ操作カテゴリから選びます。設定項目は2つだけです。

差出人(From):変換したい配列を入力します。SharePointのアイテムを取得した後なら、動的なコンテンツからbodyやvalueを渡します。

マップ(Map):出力したいプロパティを定義します。左側がキー名(出力後の列名)、右側が値(元の配列から取り出す式)です。

具体的な設定例

SharePointのタスク管理リストからタイトル・担当者・期日だけを取り出すケースで考えます。SharePointのアイテムを取得アクションで配列を取得した後、選択(Select)アクションをつなぎます。

差出人には SharePointのアイテムを取得のbody/valueを指定します。マップには以下のように設定します。

キー: タイトル    値: item()?['Title']
キー: 担当者名    値: item()?['AssignedTo']?['DisplayName']
キー: 期日        値: item()?['DueDate']

これで出力される配列は、タイトル・担当者名・期日の3列だけを持つシンプルな配列になります。元のSharePointアイテムにあったIDやバージョン情報、各種システム列はすべて除去されます。

キー名の自由な定義

マップのキー側は、出力したい列名を自由に決められます。元のプロパティ名が英語でも、日本語で出力するように変換できます。

キー: title      値: item()?['Title']
キー: 担当者      値: item()?['AssignedTo']?['DisplayName']
キー: dueDate    値: item()?['DueDate']

Teams通知用にメッセージを整形したり、別サービスのAPIが求めるフォーマットに合わせたりするときに便利です。私が現場で使う場面では、SharePointの内部列名(英語)を人が読みやすい日本語名に変換してから通知メッセージに差し込むことが多いです。

Apply to eachとの使い分け

選択(Select)のほうが処理が速い

配列の各要素から特定のプロパティを取り出したいだけなら、Apply to eachは使わないほうがいいです。Apply to eachはループ処理なので、要素が多いと実行時間が伸びます。選択(Select)アクションは内部でバッチ処理をするため、同じ処理をApply to eachで書くより速く完了します。

Apply to eachが必要なのは、各要素に対して追加のアクション(メール送信・SharePoint更新など)を実行するケースです。単に列の形を変えるだけなら選択(Select)に切り替えましょう。Apply to eachの詳細な使い方と注意点はApply to eachの解説でまとめています。

式で計算した値をマップに使う

マップの値側には式を書けます。単純なプロパティの取り出しだけでなく、フォーマット変換や文字列加工も一括でできます。

// 日付を日本語形式にフォーマット
キー: 期日表示    値: formatDateTime(item()?['DueDate'], 'yyyy年MM月dd日')

// 文字列の先頭に接頭辞をつける
キー: タスク名    値: concat('[未完了] ', item()?['Title'])

ちょっとした加工なら選択(Select)のマップ内で完結させられるので、後続のApply to eachやComposeアクションを減らせます。

選択(Select)の出力をアレイのフィルター処理(Filter Array)や通知につなぐ

配列を整形してから絞り込む

選択(Select)とアレイのフィルター処理(Filter Array)を組み合わせる場合、先に選択(Select)で列を絞ってからアレイのフィルター処理(Filter Array)に渡すのがおすすめです。アレイのフィルター処理(Filter Array)の条件式で参照するプロパティが整理されていると、式を書くときに迷いません。

逆にアレイのフィルター処理(Filter Array)を先に使って行を絞り込んでから、選択(Select)で列を整形する順序でも問題ありません。処理するデータ量を先に減らしたいならアレイのフィルター処理(Filter Array)を先に実行するほうが効率的です。アレイのフィルター処理(Filter Array)の使い方は アレイのフィルター処理(Filter Array)で条件絞り込みの記事でまとめます。

Teams通知への差し込み

選択(Select)で整形した配列をjoin関数でつなぐと、通知メッセージとして成形しやすくなります。

// アレイのフィルター処理(Filter Array)の出力をjoinで1行ずつ改行しながら連結
join(body('選択'), '
')

これだけでは各行がJSON文字列になってしまいますが、マップ側で表示したい文字列をconcatで組み立てておくと、join後にそのまま通知文として使えます。

よくある失敗パターン

item()の書き方を間違える

マップの値側でよく見るミスは、item()の書き方を間違えることです。テキストモードでは item()?['列名'] と書きます。?(オプション演算子)を省くと、プロパティが存在しない場合にフローがエラーで止まります。

特にPerson型やLookup型のような複合プロパティを参照するときは、ネストを正確に書く必要があります。

// Person型の表示名を取り出す
item()?['AssignedTo']?['DisplayName']

// Lookup型の値を取り出す
item()?['Category']?['Value']

差出人に配列でないものを渡す

差出人には配列を渡さないとエラーになります。SharePointのアイテムを取得のbodyをそのまま渡すと、配列ではなくオブジェクトが渡されてしまうことがあります。正しくはbody('アクション名')?['value'] のvalueプロパティを指定します。

実行テストでエラーが出たときは、差出人に何が入っているか作成(Compose)アクションで確認するのが早いです。

まとめ

選択(Select)アクションは地味ですが、フローの後半で使うデータを整理しておくという意味では非常に実用的なアクションです。Apply to eachで無理に処理しようとしている部分をSelectに置き換えるだけで、フローがスリムになることがあります。

まずはSharePointから取得した配列を選択(Select)で列絞り込みしてみましょう。出力がシンプルになるほど、後続のアクションの式が短く書けます。Power Automateで扱うデータが複雑に感じたときは、選択(Select)で形を整えることから始めてみてください。

Xでフォローしよう