Microsoft Power Appsで出荷指示連携データ出力アプリを作成してみた

はじめに
この記事の筆者である私は、ソフトウェアエンジニアリングの学位を取得後、ベトナム最大のIT企業の一つにてテスターとしてキャリアをスタートいたしました。
主にマッチングサービスに関するビジネス分析、単体テスト、結合テスト、総合テストを一通り経験いたしました。
2017年にベトナムより来日し、2018年に株式会社ハイペリオンに入社いたしました。
その後、運輸管理システム開発プロジェクトおよび品質保証計画プロジェクトのメンバーとして参画するなど、品質管理のエキスパートを目指し経験を重ねております。
今回は、Microsoft Power PlatformのPower AppsとPower Automateで、出荷指示連携データ出力アプリの開発に挑戦いたしました。
Microsoft Power Platformの紹介
Microsoft Power Platformとは

Power Platform (パワー・プラットフォーム)は、Microsoftが企業に提供、組織内のユーザーがアプリケーション構築、ワークフロー自動化、データ分析などソリューションを開発するためのローコードツール群。Power Apps、Power Automate、Power BI、Power Pages、Copilot Studioといったクラウドベースのサービスが含まれている。
Microsoft Power Appsとは
Power Apps(パワー・アップス)は、複雑なコーディングが不要で、業務に特化したアプリケーションを短時間で開発する可能、アプリ、サービス、コネクタ、およびデータプラットフォームの包括的なスイート。
Power Appsを活用することで、基盤となるMicrosoft Dataverse(データバース)、またはその他の多様なデータソースに格納されたデータと連携し、ビジネスニーズに合わせたカスタムアプリを迅速に構築できる。
Microsoft Power Automateとは
Power Automate(パワー・オートメイト)は、ローコードと AI を利用した包括的なエンドツーエンドの自動化ツール。
Power Automateを活用することで、ユーザーやチームは日常的に使用するアプリとサービス間を連携された自動化ワークフローを作成し、業務の自動化、データ収集、データ同期、通知受信などタスクを効率化に実行できる。
開発機能のご紹介
開発したアプリ
荷主出荷指示データインポート&連携データ出力(以下、出荷指示連携データ出力アプリと記載する)
概要
荷主から提供された様々なフォーマットの出力指示CSVファイルをアプリにインポートし、インポートしたデータを選択してテキスト出力するアプリ。
出荷指示連携データ出力アプリの機能説明
共通メニュー

No | 項目名 | 説明 |
1 | CSVアップロード | クリックすると、CSVアップロード画面に移動する。 |
2 | CSVインポート | クリックすると、CSVインポート画面に移動する。 |
3 | ファイル出力 | クリックすると、ファイル出力画面に移動する。 |
4 | 設定 | クリックすると、荷主情報やアプリパラメータの設定メニューが表示される。 荷主情報やアプリパラメータを選択すると、各設定画面に移動できる。 |
CSVアップロード画面

アプリを起動すると、最初にこの画面が表示される。
この画面で、荷主から提供された出荷指示CSVファイルをアプリ内の指定のフォルダにアップロードできる。
No | 項目名 | 説明 |
1 | 荷主 | アップロードするCSVに紐づく荷主を選択する項目。 選択肢はアプリに登録された荷主が表示される。 |
2 | 日付 | アップロードするCSVの日付を指定する項目。 日付は検索およびファイル名に使われる。 デフォルト(初期値)は現在の日付になる。 |
3 | 添付ファイル | アップロードするCSVファイルを指定する項目。 CSVファイルの指定方法は、項目にドラッグ&ドロップ、または添付追加から指定できる。 また、ファイルは複数指定ができる。 (アップロード上限数および最大ファイルサイズはパラメータ設定画面から設定。) |
4 | 添付クリア | クリックすると、添付ファイルのリストに指定しているファイルを全てクリアする。 |
5 | アップロード | クリックすると、添付ファイルのリストに指定しているファイルをアプリからフォルダにアップロードする。 アップロード処理は別のPower Automateフローで実施される。 (このサンプルアプリでは、アップロードされたファイルはグーグルドライブに保存される。) |
CSVインポート画面

この画面は、①CSVアップロード画面からアップロードされたCSVファイルを検索できる。
検索結果のファイルを選択し、インポートボタンをクリックすると、CSVファイル内のデータをインポートできる。
No | 項目名 | 説明 |
1 | 荷主 | アップロードしたCSVファイルを荷主とCSVパターン番号で絞り込みする項目。 選択肢はアプリに登録された荷主とCSVパターン番号が表示される。 |
2 | 日付 | アップロードしたCSVファイルを日付で絞り込みする項目。 デフォルト(初期値)は現在の日付になる。 (日付はCSVアップロード時に指定する。) |
3 | ファイル一覧 | 荷主や日付で絞り込み後、アップロードしたCSVファイルが一覧表示される。 複数ファイルを選択できる。 |
4 | インポート | クリックすると、ファイル一覧で選択したファイルのデータをアプリにインポートする。 また、インポート済みの重複ファイルはスキップされる。 なお、2種類の異なるCSVパターンに対応している。 インポート処理は別のPower Automateフローで実施される。 |
ファイル出力画面

この画面は、②CSVインポート画面からインポートされたデータを検索できる。
検索結果のCSVデータ行を選択し、出力ボタンをクリックすると、連携用のテキストファイルを出力できる。
No | 項目名 | 説明 |
1 | 荷主 | インポートしたCSVデータを荷主で絞り込みする項目。 選択肢はアプリに登録された荷主が表示される。 |
2 | 日付 | インポートしたCSVデータを日付で絞り込みする項目。 デフォルト(初期値)は現在の日付になる。 (日付はCSVアップロード時に指定する。) |
3 | 出力状況 | インポートしたCSVデータを出力状況(指定なし、未出力、出力済み)で絞り込みする項目。 デフォルト(初期値)は「指定なし」になる。 |
4 | データ一覧 | 荷主や日付、出力状況で絞り込み後、インポートしたCSVデータが一覧表示される。 複数レコードを選択できる。 ファイル出力済みのレコードは(✓)アイコンが表示される。 |
5 | 出力 | クリックすると、データ一覧で選択したレコードをファイル出力する。 出力処理は別のPower Automateフローで実施される。 (このサンプルアプリでは、出力されたファイルはグーグルドライブに保存されている。) |
荷主一覧画面

この画面では、アプリに登録された荷主マスタ情報を確認できる。
また、荷主を追加・更新するため画面、荷主詳細情報を確認するため画面への移動もできる。
No | 項目名 | 説明 |
1 | 検索ボックス | 検索キーワードで絞り込みする項目。 デフォルト(初期値)は空白になる。 |
2 | 荷主一覧 | 検索キーワードで絞り込み後、荷主が一覧表示される。 検索キーワードが空白の場合、一覧に荷主が全て表示される。 一覧のレコードをクリックすると、荷主詳細画面へ移動後、対象の荷主が表示される。 |
3 | 編集 | アイコンをクリックすると、荷主入力画面(更新モード)へ移動後、対象の荷主を更新できる。 |
4 | 削除 | アイコンをクリックすると、対象の荷主を削除できる。 (確認ポップアップあり) |
5 | 新規登録 | ボタンをクリックすると、荷主入力画面(登録モード)へ移動後、新しい荷主を追加できる。 |
6 | 一括削除 | 一覧のチェックボックスを選択し、ボタンをクリックすると、対象の荷主を一括削除できる。 (確認ポップアップあり) |
荷主入力画面(登録モード)

この画面の登録モードでは、新しい荷主を追加できる。
No | 項目名 | 説明 |
1 | 荷主名 | 荷主の名を入力する項目。(必須項目) |
2 | 住所 | 荷主の住所を入力する項目。(必須項目) |
3 | 電話番号 | 荷主の電話番号を入力する項目。(任意項目) |
4 | CSVパターンNo. | 荷主の使用CSVパターンを入力する項目。(必須項目、数字のみ) |
5 | 追加 | ボタンをクリックすると、入力された荷主情報がシステムに登録され、荷主一覧画面へ戻る。 |
6 | 戻る | ボタンをクリックすると、前の画面へ戻る。 |
荷主入力画面(更新モード)

この画面の更新モードでは、荷主情報を更新できる。
No | 項目名 | 説明 |
1 | 荷主名 | 荷主の名を入力する項目。(必須項目) |
2 | 住所 | 荷主の住所を入力する項目。(必須項目) |
3 | 電話番号 | 荷主の電話番号を入力する項目。(任意項目) |
4 | CSVパターンNo. | 荷主の使用CSVパターンを入力する項目。(必須項目、数字のみ) |
5 | 更新 | ボタンをクリックすると、入力された荷主情報がシステムに反映され、荷主一覧画面へ戻る。 |
6 | 戻る | ボタンをクリックすると、前の画面へ戻る。 |
荷主詳細画面

この画面では、荷主情報の確認と削除ができる。
また、荷主入力画面(更新モード)へ移動できる。
No | 項目名 | 説明 |
2 | 住所 | 荷主の住所を表示する項目。 |
3 | 電話番号 | 荷主の電話番号を表示する項目。 |
4 | CSVパターンNo. | 荷主の使用CSVパターンを表示する項目。 |
5 | 編集 | ボタンをクリックすると、荷主入力画面(更新モード)へ移動後、対象の荷主を更新できる。 |
6 | 削除 | ボタンをクリックすると、対象の荷主を削除できる。 (確認ポップアップあり) |
7 | 戻る | ボタンをクリックすると、前の画面へ戻る。 |
パラメータ設定画面

この画面では、CSVのフォルダパスなど、アプリのパラメータを設定できる。
No | 項目名 | 説明 |
1 | 最大アップロード数量 | CSVアップロード画面の1回あたりのCSVファイルの最大アップロード数を指定できる。 |
2 | 最大アップロードファイルサイズ | CSVアップロード画面の1ファイルあたりの最大サイズ(MB)を指定できる。 |
3 | CSVフォルダパス | CSVファイルをアップロードするフォルダのパスを指定できる。 |
4 | CSVフォルダID | CSVフォルダパスで指定したフォルダIDを指定する。 |
5 | ログフォルダパス | CSVインポートのログを出力するフォルダのパスを指定できる。 |
6 | ログフォルダID | ログフォルダパスで指定したフォルダIDを指定する。 |
7 | TXTフォルダパス | TXTファイルを出力するフォルダのパスを指定できる。 |
8 | TXTフォルダID | TXTフォルダパスで指定したフォルダIDを指定する。 |
開発時に気づいた点
Power AppsとPower Automateは強力なアプリ開発ツールだが、ローコードのプラットフォームであるため、コーディング知識や開発経験のない初心者には難しく感じる可能性がある。
①複雑なGUI

Power Appsのエディタ画面は、Google AppSheetやForguncy Builderなど他のノーコードツールと比較して、複雑なGUIであり、Microsoft Visual Studioのようなプロフェッショナル開発ツールに近い構造を持っている。
・Power Appsでは、他のノーコードツールと比較して、エディタの操作に慣れるまでには時間を要する。
・ボタンやチェックボックスなどの画面要素は、複雑な多くのプロパティが存在している。
②複雑なデータ操作
・Power Appsでは、Dataverseを利用しない場合、計算するためのバーチャルカラムの追加・管理が困難であり、データ処理能力やパフォーマンス面で制約を受ける可能性がある。
・Power Automateでは、データを取得する際にSQL言語は使用できず、ODataやXMLFetchなど方法を用いるため、簡単なデータ存在チェック処理も複雑になる。
・Dataverseのデータ構造および設定情報はローカルにバックアップできない。
③限られている再利用性とデバッグ性
Power AppsとPower Automateでは、リソースの再利用とデバッグが困難である。
・Power Appsでは、アイテムをコピー&ペーストできない場合がある。さらに、コピー&ペーストは、コピー先のアイテムの変数が自動的に置き換わる場合と置き換わらない場合があるため、混乱しやすくなる。
・Power Automateでは、フローやフローグループのコピー&ペーストは基本的にできない。
(実験中の機能を利用すれば、コピー&ペーストできるが、多くの不具合が存在している。)
・Power AppsとPower Automateのどちらも、従来のプログラミングのように、ソースコードのみで開発することもできない。そのため、テキストのコピー&ペーストで、リソースの再利用は容易にできない。
・Power AppsとPower Automateのエラーメッセージは、曖昧なメッセージのものが多い。特に、Power AppsからPower Automateのフローを呼び出す際に、Power Automateフロー内で発生したエラーは、Power Appsには詳細なエラー情報が送信されない。そのため、エラー特定のためにPower Automate側での詳細なデバッグが必要になる。
④誤用されやすいコマンド/関数
Power AppsとPower Automateはどちらも Power Platformスイート内にあり、相互に接続できるが、根本的なコマンド/関数が異なっている。
・Power AppsではPower Fxというローコード言語が使われるが、Power AutomateではAzure Logic Appsのワークフロー定義言語を使用している。そのため、同名のコマンド/関数でも、動作が異なる場合があり、誤用されやすい。
・例えば、concat()関数が該当する。Power Automateのconcat()は2つの文字列を連結する関数だが、Power Appsのconcat()は、テーブル内の文字列をレコード毎に結合する関数となっている。
※Power Appsで2つの文字列を連結するための関数はconcatenate()になる。
⑤機能のテンプレートが少ない

Power Appsでは、よく利用される機能であっても、サンプルやテンプレートが提供されていない場合があり、開発者は自力で作成する必要がある。
例えば、以下のようなものが該当する。
・ページング機能
・画面サイズに応じたスクロールバー表示
・複数レコード選択が可能な一覧テーブル
⑥その他
・Power PlatformのツールはMicrosoft365やAzureなど、他のMicrosoftのサービスと連携が前提となっているため、単独での構築は難しい場合が多い。また、Power Platformは組織向けの製品であるため、個人で使用するにはライセンスの契約および環境設定が複雑になる。
・Power Platformのツールは、Google AppSheetと比べて、複数ユーザーによる同時のデータ処理やオフライン機能、外部システムとの統合など、劣る点が多い。特に、アプリのパフォーマンスはPower Platformの方が、遅く感じられる。
まとめ
Microsoft Power Platformは、ノーコード開発プラットフォームではなく、ローコード開発プラットフォームであり、複雑な数式が多数含まれているため、Powerスイートのツールを効率的に開発するには、基本レベルの開発知識が必要になります。そのため、初めてアプリ構築される方は、Powerスイートのツールの使い方を習得するのに、ある程度の学習時間が必要になると思います。
一方、使い方を習得すれば、Microsoft Power Appsは強力なツールであり、Google AppSheetよりカスタマイズ性が高く、従来のプログラミング開発に比べて容易で、開発時間を短縮できます。