
Power Apps でギャラリーに並んだデータを選択してCSVに出力するには、Power Apps側とPower Automate側の役割を分けて考えることが出発点です。この分担を理解しているかどうかで、実装のスムーズさが大きく変わります。
2ステージ構成で全体を把握する
この実装は2つのステージに分かれます。Power Apps側がデータを選択・整形してフローを呼び出す段階と、Power Automate側がCSVファイルを生成して出力する段階です。アプリがデータを整形し、フローがファイルを作る。この切り分けが全体設計の核心です。
Power Apps側の処理の流れはこうなります。ギャラリーのチェックボックスで複数レコードを選択し、選択済みレコードをFilter関数で取り出し、JSON関数でJSON文字列に変換してフローに渡します。Power Automate側では、受け取ったJSON文字列をParse JSON(JSONの解析)アクションで解析し、Create CSV table(CSVテーブルの作成)アクションでCSVを生成し、メール添付やSharePoint保存など任意の出力先に渡します。
この記事ではPower Automateのアクション名を日本語と英語の両方で記載します。画面上の表示名で迷ったときの参照にしてください。

ギャラリーにチェックボックスを追加する
ギャラリーに多選択UIを実装するには、テンプレートエリアにチェックボックスを追加するところから始めます。ギャラリー自体の基本操作はギャラリーコントロールの基礎記事を先に確認しておくとスムーズです。
ギャラリーのテンプレートエリアを選択した状態でInsertメニューからCheckboxを追加します。チェックボックスのDefaultプロパティにはvarSelectAllという変数名を設定します。このvarSelectAllは後述する全選択・全解除のトグルと連動するために使います。現時点ではOnStartなどで初期値をfalseに設定しておけば問題ありません。
選択済みレコードを取り出すには、ギャラリーのAllItemsプロパティをFilterで絞り込みます。
// 選択済みレコードを取り出す
Filter(Gallery1.AllItems, Checkbox1.Value)
このFilterの結果が後続のすべての処理の起点になります。この1行で選択されているレコードだけを集めたテーブルが得られるので、合計計算・JSON変換・フロー呼び出しはすべてここから始まります。コレクション操作との組み合わせについてはコレクション操作の基礎記事もあわせて読むと理解が深まります。
全選択・全解除トグルを実装する
全選択ボタンを作るとき、varSelectAllをtrueにセットするだけでは連続して押したときに効かなくなります。一度trueにした後に再び同じボタンを押しても変数の値が変わらないため、コントロールが再レンダリングされないからです。
解決策は、falseとtrueを連続してセットすることです。UpdateContext({varSelectAll: false})を先に実行してからUpdateContext({varSelectAll: true})を実行すると、一瞬falseを経由することでコントロールの再描画が起きて全チェックがかかります。ボタンのTextプロパティにIfを使って現在の選択状態に応じてラベルを切り替えると、ユーザーへの案内としてもわかりやすくなります。
// 全選択ボタンのOnSelectプロパティ
UpdateContext({varSelectAll: false});
UpdateContext({varSelectAll: true})
// ボタンのTextプロパティ
If(IsEmpty(Filter(Gallery1.AllItems, Checkbox1.Value)), "Select All", "Deselect All")
選択数・合計を動的に表示する
選択したレコードの件数や数値列の合計をリアルタイムで表示すると、ユーザーが選択状態を確認しながら操作できます。請求明細や在庫リストなど数値を扱う業務では、出力前に合計金額を確認できる設計が現場から喜ばれます。私が社内で作った棚卸しアプリでも、この表示を入れてから「選んだ数がすぐわかる」という声をもらいました。こういう小さな配慮がUXを変えます。
// 選択件数
CountRows(Filter(Gallery1.AllItems, Checkbox1.Value))
// 選択行の合計(金額列の例)
Sum(Filter(Gallery1.AllItems, Checkbox1.Value), 金額)
ツールバーコンテナやラベルのVisibleプロパティにNot(IsEmpty(Filter(...)))を設定すると、何も選んでいないときはこれらの表示が消えます。選択がない状態では不要な情報を出さない。その配慮が使いやすいアプリと使いにくいアプリの差になります。

JSON関数で選択データを文字列に変換する
基本的な使い方
Power AppsからPower Automateにデータを渡すには、テーブル型のデータをJSON文字列に変換する必要があります。JSON関数とShowColumns関数を組み合わせて、必要な列だけを取り出したJSON配列を生成します。
// 選択データをJSON文字列に変換する
JSON(
ShowColumns(
Filter(Gallery1.AllItems, Checkbox1.Value),
"商品名",
"数量",
"金額"
),
JSONFormat.IndentFour
)
JSONFormat.IndentFourは整形出力のオプションです。改行・インデントが入って人が読みやすい形式になります。開発中はこの設定のままにしておくといいです。本番運用に移行するときにJSONFormat.Compressに変えると通信量が減ります。
シリアライズできない列のエラーに注意する
ShowColumnsに指定できる列には制限があります。Checkboxコントロール・Choice列(選択肢列)・ルックアップ列はそのままShowColumnsに入れるとエラーになります。Power Appsが内部的にレコードとして持っているデータをJSON文字列にシリアライズできないためです。
Choice列は表示値をText()で取り出してAddColumnsで新しい列として追加してから、ShowColumnsでその列名を指定します。
// Choice列をText()で取り出してからShowColumnsに渡す
JSON(
ShowColumns(
AddColumns(
Filter(Gallery1.AllItems, Checkbox1.Value),
"カテゴリ名", Text(カテゴリ.Value)
),
"商品名",
"カテゴリ名",
"金額"
),
JSONFormat.IndentFour
)
ルックアップ列(例:Supplier.SupplierName)も同様です。AddColumnsで仕入先名、Supplier.SupplierNameのように取り出してからShowColumnsに渡します。ShowColumns内でネストプロパティを直接参照しようとするとエラーになるので、必ずAddColumnsを経由する手順を守ってください。

Power Automate側の実装
Parse JSONでスキーマを自動生成する
Power Apps側から受け取ったJSON文字列をParse JSON(JSONの解析)アクションに渡します。スキーマを手動で書く必要はありません。Power Appsから実際に出力されたサンプルのJSON文字列をコピーして、Parse JSONのサンプルから生成機能に貼り付けるだけで自動生成されます。
スキーマが正しく生成されると、後続のCreate CSV table(CSVテーブルの作成)やCreate HTML table(HTMLテーブルの作成)で各列のデータ型が正しく認識されます。スキーマなしでJSONを扱おうとすると動的コンテンツの列名が表示されないため、必ずParse JSONを先に入れてください。
Create CSV tableで列名と書式を整える
Create CSV table(CSVテーブルの作成)アクションのColumnsをCustom設定にすると、列名を日本語に変更したり、日付や数値のフォーマットを指定できます。自動設定のままでは列名がシステム名そのままで出力されることが多く、受け取った人が内容を把握しにくいCSVになります。渡す相手が使いやすい形に整えるひと手間が、ツールの完成度を大きく上げます。
// 日付列のフォーマット変換(Create CSV table内のValue設定)
formatDateTime(item()?['申請日'], 'yyyy/MM/dd')
// 数値列の通貨フォーマット
formatNumber(item()?['金額'], 'C', 'ja-JP')
HTMLテーブルをメール本文に埋め込む
Create HTML table(HTMLテーブルの作成)アクションを使うと、同じデータをHTML形式のテーブルとして生成できます。このOutputをSend an email(V2)(メールの送信(V2))のBodyに差し込むだけで、メール本文にデータが表形式で表示されます。CSVファイルを添付しつつメール本文にもプレビューを表示する構成が実用的です。受信者がCSVを開かなくても概要を確認できる設計は、特に承認フローや報告業務で喜ばれます。

出力先は用途に合わせて選ぶ
CSVファイルが生成できたら、出力先は用途に応じて選択できます。メール添付はすぐに担当者に送れて手軽ですが、SharePoint保存にすると他のフローや外部システムからもファイルにアクセスできるようになります。OneDriveに保存して共有リンクをメールで送るパターンも、添付制限に引っかかるような大容量ファイルで有効です。ファイルさえ生成してしまえば、後は配置先を変えるだけでさまざまな用途に転用できます。
SolutionにまとめてチームにExportする
アプリとフローが完成したら、Solutionとしてパッケージしてチームに展開できます。Power Appsの画面でSolutionsを開き、Add existing → App または Cloud flowでアプリ・フローを追加します。Advanced → Add required objectsを選ぶと、参照しているDataverseテーブルや接続情報など依存するコンポーネントも一緒にパッケージされます。このSolutionを他のメンバーの環境にImportすることで、アプリとフローをセットで配布できます。社内でツールを横展開するときや本番環境への移行時に使える実務的なテクニックです。
Patchを使ったデータ保存の設計についてはPatch関数で新規レコードを保存する方法の記事もあわせて読むと、データ操作全体の理解が深まります。生成したCSVをさらにExcelに変換してSharePointリストに取り込む応用的な使い方は、Power Automate × Excel ScriptsでCSVをXLSXに変換する記事で詳しく扱っています。
まとめ
Power Appsでのデータ選択からCSV出力までは、アプリ側の整形とフロー側のファイル生成という2ステージの組み合わせで成り立っています。構造が見えてしまえば、実装は一つひとつの手順の積み重ねです。特にJSON関数のエラーは初見で戸惑いますが、Choice列とルックアップ列の処理パターンを一度理解すれば以降は同じ手順を適用するだけです。私もはじめてこれを組んだときにシリアライズエラーで詰まりましたが、AddColumnsで取り出してからShowColumnsに渡すという手順を身につけてからは、同じ問題で止まることがなくなりました。
市民開発とはこういう地道な積み重ねです。一度動くものを作ってしまえば、それが次の応用の土台になります。楽しみながら進めていきましょう。