【PowerApps】 Power Automate無しでギャラリーのデータをエクスポートする方法(在庫管理アプリの作り方後編)
PowerAppsでギャラリーのデータをエクスポートするには通常Power Automateを使いますが、今回はもっと簡単に作れるPower Automate無しでやる方法を図解しています。実はこの方が実務的にもっと便利になります。
(動画時間:10:09)
Udemy.comでオンラインコースを運営しています。
マイクロソフトPowerApps 中級編【SharePointで、実務で使える業務アプリの作り方:勤怠管理アプリ編】
⇒ 半額になる「ディスカウントリンクページ」へ
Power Automateなしでのデータのエクスポートの実演
こんにちは、リーンシグマ、ブラックベルトのマイク根上です。
業務改善コンサルをしています。
前回の動画でPowerAppsでの
在庫管理アプリの作り方をお見せしました。
⇒「PowerApps で、在庫管理、棚卸アプリの作り方 【前編:入出庫管理機能】」
今回はその後編で棚卸機能の実装の仕方と、
ギャラリーで表示しているデータをエクセルに
エクスポートする機能の作り方をご紹介します。
それには通常Power Automateを使いますが、
今回はもっと簡単に作れるPower Automate無しでやる方法ですが、
実は実務的にもっと便利なのです。

これが今回作ったアプリで、
上部の在庫の「入出庫処理」の機能の作り方は前回やりました。
⇒「PowerApps で、在庫管理、棚卸アプリの作り方 【前編:入出庫管理機能】」
今回作るのは中央の「棚卸処理」機能です。
上のドロップダウンで商品を選んで
その現在庫数を数えて真ん中の「棚卸数」のボックスに入力し、
「在庫調整」ボタンをクリックします。
すると下のギャラリーのその商品の在庫履歴のトップの「現在庫数」列に
入力した棚卸数が入り、「科目」列に「棚卸」、「数量」列に調整数が入ります。
この調整数は「今回の棚卸数ー前回の現在庫数」で算出し、
この計算式を「在庫調整」ボタンを作成する時に使います。
上の画像ではギャラリーに「商品毎」の在庫管理履歴が表示されていますが、
下の「切り替え」ボタンで、全商品の「棚卸記録」だけの表示にできます。
そしてその横の「エクセルに出力」ボタンをクリックすると、
ブラウザが開き下図の様にギャラリー内と同じデータを
エクセルオンライン上にエクスポートできます。

このタブは一度閉じて、
今度は「商品毎」の履歴を表示して、
「Excelに出力」ボタンをクリックし、
ちゃんとまたギャラリーの内容がエクスポートされます。
タイトルのセル(上図、セルB2)に関数を入れて
データの内容によってタイトルを変えています。
セルB2内
=IF(COUNTA(D:D)=COUNTIF(D:D,”棚卸”)+1,”棚卸報告書”,”在庫管理履歴”)
PowerAppsでの他のエクスポートの方法との比較
最初はこのエクスポート機能を
Power Automateを使って作りました。
しかし、その方法だとデータをCSVファイルに入れて
それをEメールで自分に送り、
メールを開けないとそのCSVファイルを開ける事ができません。
今回の方法だと直接エクセルファイルが開けられるのでより便利なのです。
実はPowerAppsのメニューバーの「挿入」、「メディア」から、
「エクスポート」コントロールを追加できます。
しかし、そのコントロールでは
エクスポートできるデータ型はJSONファイルだけです。
その場合、エクセルに持ってくるのに、
エクセルのメニューバーの「データ」、「データの取得」、
「ファイルから」、そして「JSONから」を選んで初めて
エクセルでデータを見る事ができます。

一般ユーザーにこの作業を強いるより、
先ほどのボタンを押すだけでエクセルが開く方が
利便性が良いでしょう。
ですので今日はその方法の作り方をお見せします。
Power Automate無しのエクスポートの作り方
まず、今回の仕組みの概要を話しますと、
1)出力するエクセルファイルを用意。
2)それをOneDriveに保存。
3)アプリのボタンを押したら、
ギャラリーのデータが最初の
エクセルファイルに保存される。
4)そのエクセルファイルを開く。
洗練された方法ではないですが、
かなり実務で使えると思います。
出力先のエクセルファイルを用意する。
それでは実際に作ってみましょう。
まず出力先のエクセルファイルの用意です。
出力する列名を書いて、
その上でコントロール+「T」か、
メニューバーの「ホーム」、「テーブルとして書式設定」から、
その表をエクセルテーブルに変換します。

そして、メニューバーの「テーブルデザイン」から、
分かり易いテーブル名にしておきます。
今回は「エクセルテーブル」とします。(上図参照)
次にこのファイルをご自分の会社の
OneDrive For Business内に保存するのです。
そしてPowerAppsの開発画面に行き、
「データの追加」からそのエクセルテーブルに接続します。
エクスポートボタンの「OnSelect」属性の数式(コレクション+Patchの高速処理)
次にアプリの「Excelに出力」ボタンの
「OnSelect」属性を見てみましょう。
「Excelに出力」ボタンの「OnSelect」属性
=If(
CountRows(エクセルテーブル) > 0,
RemoveIf(
エクセルテーブル,
true
)
);
ClearCollect(
MyCol,
エクセルテーブル
);
ForAll(
Gallery1.AllItems,
Collect(
MyCol,
{
商品名: Product,
日時: Date_Time,
科目: Category,
数量: Counts & “”,
現在庫数: Total_Counts & “”
}
)
);
Patch(
エクセルテーブル,
MyCol
);
Launch(“https://…[OneDriveに保存されているURL]…xlsm?web=1”)
最初のIf文内でCountRows関数で
エクセルテーブルのデータ数を数えて、
0以上、つまり既存データがあれば、
RemoveIf関数で、そして第二引数に「true」を入れてあるので、
全データを削除します。
次の式でClearCollect関数で「MyCol」というコレクションに
「エクセルテーブル」を丸ごと代入しています。
この履歴のギャラリー名は「Gallery1」です。
ForAll関数を使って、そのギャラリーの全データを
「MyCol」コレクションに入れています。
この時に「MyCol」コレクションと「エクセルテーブル」は
全く同じ列名である事に留意して下さい。
全く同じ列名であるので、次のPatch関数の書き方で
「MyCol」コレクションの全データを
エクセルテーブルに保存する事ができるのです。
しかもこの書き方だと高速に処理ができます。
コレクションを使わずにForAllで直接ギャラリーから
エクセルテーブルに一行づつ保存する事もできますが、
データ数が多くなると処理に時間が掛かります。
コレクションにForAllでデータを入れるのは
メモリ上の話なので高速で行えるのです。
多行データを保存するのにForAll+Patchが一般的ですが、
このコレクション+Patchはもっと高速なのです。
このテクニックは色んな所で使えますのでマスターして下さい。
⇒「【Power Apps】 ギャラリー内の複数行を一括保存する、ForAll+Patchと超高速なコレクション+Patchのやり方」
OneDriveに保存しているエクセルファイルの開き方「パスのコピー」
最後にLaunch関数でOneDriveに保存してある
エクセルファイルを開けます。
そのURLの取得場所はエクセルファイルに戻って、
「ファイル」、「情報」、
そしてこの「パスのコピー」をクリックして取得できます。
さっきのLaunch関数に戻ってペーストします。
そのURLの最後に「?web=1」の文字列があります。
そのままだと先ほどの様にエクセルオンラインで開きます。
ユーザーの次の作業で、その方が都合が良ければ
そのままで良いですし、
PCのエクセルで開いた方が都合が良ければ、
その「?web=1」を削除します。
それですと、エクセルファイルがダウンロードされて、
PCのエクセルでギャラリーの内容を見る事ができます。(下図参照)

このエクセルテーブルはPowerAppsのデータソースですので
上図G列の様にPowerApps ID列が入ってしまいます。
これはユーザーには関係ないのでその列を非表示にして
このファイルを保存すれば良いのです。
また、もしVBAをお使いなら、
このテーブルはデータを取得するだけに使い、
普段は全体の列を非表示にして、
VBAのオープンイベントを使って、
そのテーブルのデータを使い
お好きなレイアウトと書式で表示すると
活用の幅は格段に上がります。
そのテクニックを使った印刷の方法を
次のリンクの動画でご紹介しています。
⇒「PowerAppsとエクセルで紙に印刷する最終解決法(今のところ)」
PowerAppsでの棚卸処理の機能の作り方
話が前後してしまいますが、
PowerApps開発画面に戻って真ん中の「在庫調整」ボタンの
「OnSelect」属性の数式も確認しましょう。
ここでやっている事はWith関数で、
選択されている商品の直近の現在庫数を一時的変数「現在庫変数」に入れ、
入力された棚卸数を一時的変数「棚卸数変数」に入れています。
そしてPatch関数でデータソースの各列に適宜データを入れ、
「現在個数」列に「現在個変数」の値を入れ、
「数量」列に「棚卸数変数ー現在庫変数」計算結果を入れていて、
これが在庫調整数になるのです。
そして次の入力がし易い様にReset関数で
棚卸数のテキスト入力コントロールを初期化しています。
最後にギャラリーの「Items」属性も見てみましょう。
ギャラリーの「Items」属性
=If(
Toggle_表示切替1.Value,
SortByColumns(
Filter(
在庫管理表,
Category = “棚卸”
),
”Date_Time”,
SortOrder.Descending
),
SortByColumns(
Filter(
在庫管理表,
Product = DD_選択した商品1.Selected.Value
),
”Date_Time”,
SortOrder.Descending
)
)
下の切り替えボタンが「棚卸記録」になっている時、
つまりその「Value」属性が「true」の時に、
データソースの「科目」列の値が「棚卸」のものだけで抽出し、
「日時」列で新しい順で並べ替えをしています。
切り替えボタンが「商品毎」、つまり「false」の時は
選択されている商品で抽出して
「日時」列で新しい順で並べ替えをしています。
ギャラリーの上の列名を表示しているラベルの
「Text」属性にも切り替えの値によって
列名が変わる様に工夫がされています。
列名ラベルの「Text」属性
=If(
Toggle_表示切替1.Value,
” 調整日:商品 科目 数量 現在庫数”,
” 日時 科目 数量 現在庫数”
)
前回と今回の内容で在庫管理、棚卸アプリの完成です。
PowerAppsではデータのエクスポートと
印刷機能が弱いと言われています。
しかし、今回のエクセルファイルとの連携の方法で
実務でも足りうる機能になりますのでぜひご活用してみて下さい。
「こちらの記事も読まれてます。」
Comment
マイク根上様
いつも有用な記事、動画をありがとうございます。これらを参考にPowerAppsに挑戦しています。
こちらの記事のギャラリーをエクセル出力する実装が自分がやりたい使い勝手にあっているので、応用しいるのですが、エクセルテーブルでコレクションを初期化する部分のClearCollectでエラー”タイプに互換性がありません。このタイプの値をコレクションに含めることはできません。”になっており、解決策が見つからずおります。
アドバイスいただけませんでしょうか。