Power Apps iconPower AppsことはじめPower Apps icon
【脱・紙とExcel】クイック報告アプリ
Step 4 / 7

[開発] 関数でExcelへデータを送信する基本の書き方

入力したデータをExcelに保存するための関数を学びます。

データ保存の方法はいくつかありますが、このレシピでは二通りを紹介します。

保存方法①保存ボタンを使うするやり方

基本的な保存方式で、開発しやすいです。

  1. FooterContainer内の「+」を押下し、「ボタン」を選択して追加します。
  2. ボタンの詳細設定にある「OnSelect」に下記のコードを入力します。
    ※ReportFormのところは、Formコンポーネントの名前が入ります
SubmitForm(ReportForm);
  1. ボタンのディスプレイにある「テキスト」は「保存する」にします。
    ※詳細設定からの場合、「Text」は「"保存する"」にする(ダブルクォーテーションが必須
  2. ReportFormの「OnFailure」に下記のコードを入力します。
Notify("保存に失敗しました: " & ReportForm.Error, NotificationType.Error)
  1. ReportFormの「OnSuccess」に下記のコードを入力します。
    ※ResetFormで入力欄を初期値にリセット、NewFormで入力欄を新規状態にします
Notify("保存に成功しました", NotificationType.Success);
ResetForm(ReportForm);
NewForm(ReportForm)

Tips: Notify関数Form系の関数を使用します。

保存処理のテスト

編集フォームと保存ボタンを使用し、データが反映されるかを確認します。

  1. 「アプリのプレビュー」を選択し、アプリを起動します。
  2. 全ての列に適当な文字を入力し、保存ボタンを押下します。
  3. 保存に成功すると「保存に成功しました」と表示され、Excelを確認するとデータが反映されています。

保存処理の作成 保存結果の確認

入力値の受け付け制御

未入力の値がある場合、保存せずにエラー表示します。

  1. ReportFormのNoカードを押下し、詳細設定の「Required」が「true」になっていることを確認します。
    ※trueの場合、入力必須
  2. 報告者カードを押下し、「Required」を「false」から「true」に変更します。

Caution: 厳しすぎる入力チェックはUXに影響します。

Noは入力せずに自動採番

  1. ReportFormのNoカードを押下し、「DataCardValue」を選択します。
  2. 詳細設定の「DisplayMode」を「DisplayMode.View」に変更します。
  3. 詳細設定の「Default」をCoalesce(Max(ThisItem.No) + 1, 1)を入力します。
    ※この数式には委任の警告が出ますが、今回は小規模なアプリのため無視して良いです

Caution: 委任エラーはクエリに制限が発生します。標準では500行、上限2000行までです。

報告日は日付で制御

DataCardValueの書式はテキストor数値で、日付がありません。
方法は①Today()を使う、②DatePickerコントロールを使う、の二択です。

  1. Today()を使う場合、報告日カードのDataCardValueから詳細設定の「Default」にToday()を入力します。
  2. ②DatePickerコントロールを使う場合、DataCardValueの代わりに、挿入から「日付の選択」を使用します。
    ※「データカードがロックされている」表示が出た場合、「ロック解除と追加」を選択します
  3. DataCardValueに合わせて位置やサイズを調整し、DataCardValueは削除するか、表示しないようにします。
    ※非表示はディスプレイから「表示」を「オフ」にします

保存方法②Patch関数を使うするやり方

Patch関数は、データソースに対してレコードを作成または更新するための関数です。

  1. 下記の数式を保存ボタンの「OnSelect」に入力します。
With(
    {
        u: ReportForm.Updates,                         // フォームの入力値まとめ
        _nextNo: Coalesce(Max(ReportData, No) + 1, 1)  // 自動採番(Excelは委任に注意)
    },
    // 必須チェック:報告者
    If(
        IsBlank(u.報告者),
        Notify("報告者は必須です。入力してください。", NotificationType.Error),
        // それ以外は Patch 実行
        With(
            {
                _saved:
                    Patch(
                        ReportData,
                        Defaults(ReportData),
                        // === 保存する列 ===
                        {
                            No: _nextNo,            // 自動採番
                            報告日: u.報告日,
                            報告者: u.報告者,        // 必須
                            場所: u.場所,
                            経度: u.経度,
                            緯度: u.緯度,
                            写真: u.写真,
                            詳細コメント: u.詳細コメント
                        }
                    )
            },
            If(
                IsBlank(_saved),
                Notify("保存に失敗しました。", NotificationType.Error),
                Notify("保存しました。", NotificationType.Success);
                // フォーム初期化
                ResetForm(ReportForm);
                NewForm(ReportForm)
            )
        )
    )
)
  1. ReportFormの「OnSuccess」と「OnFailure」は「false」にします。

Tips: Patch関数は、保存方法①でコンポーネントごとに設定していた保存ロジックを一つの式に集約するものです。

できたもの

編集フォームの作成