
Microsoft社が提供するローコード開発ツール「Power Platform」のアプリ機能(Power Apps)を使用した、データテーブルおよびデータ複写機能付き契約書管理アプリの作成例を紹介します。
- 操作環境:
- OS:Windows 11
- Webブラウザー:Edge
- 使用プラン:Microsoft 365 Business Premium
アプリ実装:一覧画面
部品の削除・追加
既存のギャラリーを削除します。
左側[ツリービュー]の[BrowserGallery1]の[…]を選択し、[削除]を選択します。

検索条件を切り替えるラジオボタンと検索結果用のデータテーブルを追加します。
上メニューの[挿入]から、ラジオボタンとデータテーブルを1個ずつ追加します。

追加したデータテーブルについて、データソースの選択を求められたら、[契約書管理]を選択します。

検索条件項目の設定
ラジオボタンについて、以下の通り設定します。
- 名前:rdView
- Default: "締結準備中"
- Height:70
- Items: ["締結準備中","満了間近","全データ"]
- Layout:Layout.Horizontal
- RadioSize:50
- Width:640
- X:0
- Y:RectQuickActionBar1.Height

検索入力欄(TextSearchBox1)について、以下の通り設定します。
- HintText: "取引先名のキーワード(部分一致)"
- Width:1280
- X:640

検索結果項目の設定
データテーブルについて、以下の通り設定します。
- 名前:tblView
- Height: App.Height-RectQuickActionBar1.Height-rdView.Height
- Width: App.MinScreenWidth
- X:0
- Y: RectQuickActionBar1.Height+rdView.Height
[Items]プロパティについては、以下の通り設定します。
Sort(
Switch(rdView.Selected.Value,
"締結準備中", Filter([@契約書管理],ステータス.Value="締結準備中",
TextSearchBox1.Text in 取引先名),
"満了間近", Filter([@契約書管理],ステータス.Value in ["締結準備中","締結中"],
契約終了日<=Today()+90, TextSearchBox1.Text in 取引先名),
Filter([@契約書管理], ステータス.Value<>"無効",TextSearchBox1.Text in 取引先名)
)
,契約書ID, If(SortDescending1, SortOrder.Ascending, SortOrder.Descending)
)

データテーブルを選択した状態で、右側[プロパティ]を選択し、[ディスプレイ]を選択し、[○件選択済み]を選択します。
一覧表示で不要な項目(この例ではTitle,コンテンツタイプ,添付ファイルあり)の[…]を選択し、[削除]を選択します。

[フィールドの追加]を選択し、一覧表示で必要な項目(この例では契約書ID)について、チェックをつけ、[追加]を選択します。
各項目の[…]を選択し、[上へ移動],[下へ移動]を選択し、項目の表示順を調整します。

データテーブルの各列について、マウス操作か右側[プロパティ]で幅を調整します。
さらに、OnSelectプロパティの値をNavigate(DetailScreen1, ScreenTransition.None)に変更します。

図表6-7,8のフィールド名について、field_xのように内部フィールド名が表示される場合があります。
内部フィールド名はSharePointリストの[設定>リスト情報]から列名を選択し、URLの一番最後で確認できます。
SharePointリストをExcelから作成した場合、内部フィールド名がfield_xのような値になります。SharePointリストからPowerAppsアプリを作成した場合は内部フィールド名ではなくSharePointリストの列名が使用されますが、[データの追加]からSharePointリストを追加した場合は内部フィールド名が使用されます。

アプリ実装:詳細画面
画面タイトル・アイコン設定
画面タイトルについて、以下の通り設定します。
- DisplayMode:"契約書管理 (契約書ID:" & DataCardValue1.Text & ")"
*DataCardValueXの[X]の値は左側[ツリービュー]の契約書IDの値を確認します

削除アイコンについて、以下の通り設定します。
- DisplayMode:If(!IsBlank(tblView.Selected) && DataSourceInfo([@契約書管理], DataSourceInfo.DeletePermission), DisplayMode.Edit, DisplayMode.Disabled)
- OnSelect:Patch(契約書管理,LookUp(契約書管理,契約書ID=Value(DataCardValue1.Text)), { ステータス:{Value:“無効”} })
*削除アイコンはSharePointリストデータの物理的な削除ではなく、ステータスを無効に更新する仕様に変更します
- Tooltip:"この項目の無効化"

詳細フォーム・非表示項目の設定
詳細フォーム(左側[ツリービュー]の[DetailForm1])について、以下の通り設定します。
- Height:500
- Item:tblView.Selected

契約書IDは画面タイトルに表示しますので、詳細フォーム内の項目は非表示にします。
左側[ツリービュー]から契約書IDを選択し、以下の通り設定します。
- Visible:false

項目追加・レイアウト調整
左側[ツリービュー]の[DetailForm1]を選択し、右側[プロパティ]の[ディスプレイ]タブを選択し、[○件選択済み]を選択します。
[フィールドの追加]を選択し、[添付ファイル]にチェックをつけ、[追加]を選択します。

少々扱いに癖がありますが、各項目の全体領域を選択し、右側[プロパティ]の[詳細設定]の下の方にある、[Height]、[Width]、[X]、[Y]に値設定すると意図したレイアウトになります。
- 0行目:ステータス(幅320),取引先名(幅640),契約区分(幅320)
- 1行目:契約書名(幅640),契約開始日(幅320),契約終了日(幅320)
- 2行目:メモ(幅960),添付ファイル(幅960)
添付ファイルのデータ領域(DataCardValueX)の高さは150にします。

部品の追加・設定
上メニューの[挿入]から、ラベルを1個追加し、以下の通り設定します。
- 名前:lblHistoryDetail
- FontWeight: FontWeight.Semibold
- Text: "【上記と同じ取引先の他の契約書データ】"
- X:0
- Y:DetailForm1.Height+RectQuickActionBar2.Height

一覧画面のデータテーブルをコピーし、詳細画面(DetailScreen1)にこれをペーストします。

コピー&ペーストしたデータテーブルについて、以下の通り設定します。
- 名前:tblHistoryDetail
- Height: App.Height-RectQuickActionBar2.Height-DetailForm1.Height-lblHistoryDetail.Height
- Y: lblHistoryDetail.Height+DetailForm1.Height+RectQuickActionBar2.Height
[Items]プロパティについては、以下の通り設定します。
Sort(
Filter(
[@契約書管理], DataCardValue2.Text=取引先名,
契約書ID <> Value(DataCardValue1.Text), ステータス.Value <> “無効”
),
契約書ID, SortOrder.Descending
)

データテーブルの各列のOnSelectプロパティの値をfalseに変更します。

アプリ実装:編集画面
画面タイトル・アイコン設定
画面タイトルについて、以下の通り設定します。
- DisplayMode:"契約書管理 (契約書ID:" & DataCardValue9.Text & ")"

保存アイコンのOnSelectプロパティについて、以下の通り設定します。
//新規登録時の契約書IDは最終レコードの契約書ID+1とする
If(EditForm1.Mode=FormMode.New, UpdateContext({ loc_contract_id:Last([@契約書管理]).契約書ID+1 }));
//契約開始日・終了日の整合性チェック
If(IsBlank(DataCardValue13.SelectedDate)=false && IsBlank(DataCardValue14.SelectedDate)=false
&& DataCardValue13.SelectedDate>DataCardValue14.SelectedDate,
UpdateContext({loc_error_message:"契約開始日が契約終了日より大きな値にできません"}),
UpdateContext({loc_error_message:""});SubmitForm(EditForm1)
);

編集フォーム・非表示項目の設定
編集フォーム(左側[ツリービュー]の[EditForm1])について、以下の通り設定します。
- Height:514
- Item:tblView.Selected

契約書IDは画面タイトルに表示しますので、編集フォーム内の項目は非表示にします。
左側[ツリービュー]から契約書IDを選択し、以下の通り設定します。
- Visible:false

項目追加・レイアウト調整、コントロールの種類変更
左側[ツリービュー]の[EditForm1]を選択し、右側[プロパティ]の[ディスプレイ]タブを選択し、[○件選択済み]を選択します。
[フィールドの追加]を選択し、[添付ファイル]にチェックをつけ、[追加]を選択します。

少々扱いに癖がありますが、各項目の全体領域を選択し、右側[プロパティ]の[詳細設定]の下の方にある、[Height]、[Width]、[X]、[Y]に値設定すると意図したレイアウトになります。
- 0行目:ステータス(幅320),取引先名(幅640),契約区分(幅320)
- 1行目:契約書名(幅640),契約開始日(幅320),契約終了日(幅320)
- 2行目:メモ(幅960),添付ファイル(幅960)
添付ファイルのデータ領域(DataCardValue)の高さは150にします。

左側[ツリービュー]の[EditForm1]を選択し、右側[プロパティ]の[ディスプレイ]タブを選択し、[フィールドの編集]を選択します。
以下の通りコントロールの種類を変更します。
- メモ:複数行テキストの編集
- 取引先名:許可値

コンテキスト変数設定
複写機能と契約開始日・終了日の整合性チェックで使用するコンテキスト変数の初期値を設定します。
左側[ツリービュー]の[EditScreen1]を選択し、OnVisibleプロパティを以下の通り設定します。
UpdateContext({
loc_status:LookUp(Choices([@契約書管理].ステータス),Value="締結準備中"),
loc_partner_name:"",
loc_category:Blank(),
loc_subject:"",
loc_start_date:Blank(),
loc_end_date:Blank(),
loc_memo:"",
loc_error_message:""
});

各項目の設定変更
取引先名のデータ領域を選択し、右側[プロパティ]の[詳細設定]タブを選択し、ロックを解除します。
以下の通り設定します。
- Default:If(EditForm1.Mode=FormMode.New,loc_partner_name,Parent.Default)
*新規登録時はコンテキスト変数の値を渡します
- Items:Sort(Filter([@取引先管理],ステータス.Value="使用可"),取引先ID,SortOrder.Ascending)
*取引先の選択肢はステータスが使用可のデータを取引先IDの昇順に表示します
右側[プロパティ]の[ディスプレイ]タブを選択し、[Value]で[取引先名]を選択します。

取引先名の全体領域を選択し、右側[プロパティ]の[詳細設定]タブを選択し、ロックを解除します。
以下の通り設定します。
- Update:DataCardValue20.SelectedText.Value

ステータスのデータ領域を選択し、ロックを解除し、以下の通り設定します。
- DefaultSelectedItems: If(EditForm1.Mode=FormMode.New,loc_status,Parent.Default)
- Items: Choices([@契約書管理].ステータス)
契約区分も同じ要領で設定します。

契約書名のデータ領域を選択し、ロックを解除し、以下の通り設定します。
- Default: If(EditForm1.Mode=FormMode.New,loc_subject,Parent.Default)
メモも同じ要領で設定します。

契約開始日のデータ領域を選択し、ロックを解除し、以下の通り設定します。
- DefaultDate: If(EditForm1.Mode=FormMode.New,loc_start_date,Parent.Default)
- Size:20
契約終了日も同じ要領で設定します。

部品の追加・設定(データテーブル)
詳細画面のデータテーブル用ラベルをコピーし、編集画面(EditScreen1)にこれをペーストします。
ラベル名をlblHistoryEditに変更します。

詳細画面のデータテーブルをコピーし、編集画面(EditScreen1)にこれをペーストします。

コピー&ペーストしたデータテーブルについて、以下の通り設定します。
- 名前:tblHistoryEdit
[Items]プロパティについては、以下の通り設定します。
Sort(
Filter(
[@契約書管理], DataCardValue20.SelectedText.Value=取引先名,
契約書ID <> Value(DataCardValue9.Text), ステータス.Value <> "無効"
),
契約書ID, SortOrder.Descending
)

部品の追加・設定(エラーメッセージ・複写ボタン)
契約開始日・終了日の整合性チェックのエラーメッセージ用ラベルと複写用ボタンを追加します。
上メニューの[挿入]から、ラジオボタンとデータテーブルを1個ずつ追加します。

追加したエラーメッセージ用ラベルについて、以下の通り設定します。
- 名前:lblErrorMessage
- Color:RGBA(255, 0, 0, 1)
- Height:120
- Text:loc_error_message
- Width:640
- X:1280
- Y:240

追加した複写用ボタンについて、以下の通り設定します。
- 名前:btnCopy
- Height:50
- Size:20
- Text:"選択データ複写"
- Tooltip:"添付ファイルは複写不可"
- Visible:If(EditForm1.Mode=FormMode.New,true,false)
- Width:640
- X:640
- Y:596
[OnSelect]プロパティは以下の通り設定します。
UpdateContext({
loc_status:tblHistoryEdit.Selected.ステータス,
loc_partner_name:tblHistoryEdit.Selected.取引先名,
loc_category:tblHistoryEdit.Selected.契約区分,
loc_subject:tblHistoryEdit.Selected.契約書名,
loc_start_date:tblHistoryEdit.Selected.契約開始日,
loc_end_date:tblHistoryEdit.Selected.契約終了日,
loc_memo:tblHistoryEdit.Selected.メモ
})

図表8-19 追加部品の設定(ボタン)
アプリが完成しました。右上の公開アイコンを選択すると、このバージョンを公開できます。

おわりに(設定要素まとめ)
このアプリの作成において、特にポイントになりそうな設定要素を挙げておきます。何かアプリを作成する時の参考になれば幸いです。
当ブログ内の連載記事