【Power Apps】バリデーションチェック(エラーチェック)の実装方法

# Power Appsの編集フォームでのバリデーションチェック実装方法の比較

Power Apps を使用してアプリを構築する際、ユーザーが正しい情報を入力できるようにバリデーションチェック(エラーチェック)を実装することは重要です。
本記事では、一般的なフォームのバリデーションチェックをもとに、**Power Apps の編集フォームでのエラーチェックとバリデーションについて、UI（ユーザーインターフェース）的な観点と作業工数的な観点から比較し、どの方法が最適かを解説**します。

この記事は [Microsoft Power Apps Advent Calendar 2024](https://qiita.com/advent-calendar/2024/powerapps) シリーズ1 12月4日 担当分の記事です。

## 比較まとめ

### ユーザー視点での実装パターンごとのメリット・デメリット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/d934ca42-6b82-b763-5a0d-9cc8984ee280.png)

上記の表のメリット・デメリットより、**1の実装パターンは入力項目が多いフォーム**に、**2の実装パターンは入力項目のエラー条件が複雑な場合**に適していると考えられます。
3のボタン非活性を利用する場合は、2の方法を併用しないとユーザーはエラー理由を知ることができないので注意です。

### Power Appsでのバリデーションチェックの実装パターン比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/687144f5-5f5b-f863-969d-db70480e67e1.png)

複雑な条件(＝工数がかかる)順に実装パターンの強みと弱みを比較しました。
要件に応じて適切な実装パターンを選択しましょう。具体的な実装方法は後述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/0aa098c9-f0d2-2c40-a79d-07c51ef8333b.png)

また要件ごとの推奨実装パターンは上記の表のとおりです。
前提としてPower Appsで複雑なバリデーションチェックを行うことは非推奨ですが、実装する場合は後述の説明を参考に実装してみてください。

## まえおき

バリデーションチェックの実装方法を説明する前に、そもそも**Power Appsでは簡単にバリデーションチェックを実装することができない**ということは理解しておく必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/f59958ed-01d9-fc13-02b4-77d3190f9f77.png)

データソースの必須にチェックを入れるだけであれば比較的簡単に必須チェックが可能なため、できるだけこの程度の実装に留めておくのがベターです。

とはいえ要件としてどうしても必要な場合は多々あると思いますので、簡単に実装する方法を紹介します。

### **Requiredプロパティをtrueにする**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/f8c6629f-9c31-87a9-aa99-84a404337f0a.png)

データソース側で列を必須に設定していれば自動でカードのRequiredプロパティがtrueになっていますが、これを活用するのが一番楽です。
Requiredがtrueで何も入力されていない状態でSubmitFormすると(＝Updateプロパティが空)、エラーとなり保存することができません。

### **データ型に応じたコントロール選定・設定**・プロパティの活用

https://powerplatformnikki.com/controldif

ユーザーに入力してほしいデータに応じてデータ型やコントロールを選択することも重要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/cd0aced5-946f-b21c-367d-269cb1c8dd5a.png)

またプロパティを活用することでもユーザーの入力を制限できます。
例えばテキスト入力コントロールの書式プロパティを数値にすれば、ユーザーは数値のみしか入力することができなくなります。

### **ユーザーに誤った値を選択させないロジック**

エラーチェックを行うよりもユーザーに異常な値を選択させないようにロジックを組んだ方が、ユーザーにとってもストレスが少ないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/bb936705-070d-445b-1169-ff419ab8f7ce.png)
特定の条件下では項目が表示されないようにフィルターをかける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/95d60ec6-1105-cf56-5bc0-ab0f2a52ae6e.png)
他の項目から自動設定にしてカードをViewモードにする

## **Errorプロパティを利用したリアルタイムチェック**

### 特徴

* **ユーザーが入力中に即座にバリデーションチェックを行う方法**です。
* 正しく入力するまでエラーが表示され続け、エラーが表示されている状態で保存ボタンをクリックするとさらにエラー通知がされます。
* 多くのフィールドに対してバリデーションチェックを行う場合には有効ですが、それなりに工数がかかります。

### 実装方法
以下の記事をご覧ください。

https://powerplatformnikki.com/complexvalidation/

## **コントロールからフォーカスアウト時にチェック**

### 特徴

* ユーザーがテキスト入力コントロールからフォーカスアウトしたときにエラーチェックを行います(タイミングはDelayOutputなどの設定により異なる)
* すぐにエラーメッセージが表示されるので、複雑な条件であってもユーザーはどのようにエラーを解消すればよいかを即時に理解することができます。

### 実装方法

一般的なパスワードのエラーチェック(8文字以上で数値、小文字、大文字を含む)の実装例です。

#### Notify関数でエラーメッセージ表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/93d784da-7851-f60b-4d91-00da041a0d9b.png)

```plain
UpdateContext({
    _ErrorMsg:
    If(
        Len(Self.Value) < 8,
        "8文字以上にしてください",
        !IsMatch(Self.Value, "\d", MatchOptions.Contains),
        "数値を含めてください",
        !IsMatch(Self.Value, "[a-z]", MatchOptions.Contains),
        "小文字を含めてください",
        !IsMatch(Self.Value, "[A-Z]", MatchOptions.Contains),
        "大文字を含めてください"
    )
});
If(
    !IsBlank(_ErrorMsg),
    Notify(
        _ErrorMsg,
        NotificationType.Error
    );
    Reset(Self)
)
```

#### ラベルにエラーメッセージ表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/4816e03e-c149-6958-a4a0-488a559a155c.png)

```plain
UpdateContext({
    _ErrorMsg:
    If(
        Len(Self.Value) < 8,
        "8文字以上にしてください",
        !IsMatch(Self.Value, "\d", MatchOptions.Contains),
        "数値を含めてください",
        !IsMatch(Self.Value, "[a-z]", MatchOptions.Contains),
        "小文字を含めてください",
        !IsMatch(Self.Value, "[A-Z]", MatchOptions.Contains),
        "大文字を含めてください"
    )
});
If(
    !IsBlank(_ErrorMsg),
    Reset(Self)
)
```

## **SubmitForm前にIfでチェック**

### 特徴

* **SubmitFormに条件分岐ロジックを追加することでエラーチェックを行う方法**です。
* 複雑な条件や複数の項目でバリデーションチェックを行う場合は保守性が落ちるので、他の実装方法を選択する必要があります。

### 実装方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/471863b3-0783-e0c3-3ecc-debf01951140.png)

```plain
If(
    発売日_DataCard1_1.Update > Today(),
    Notify("今日以前の日付を入力してください。", NotificationType.Error),
    SubmitForm(Form1_1)
)
```

複雑な条件分岐が必要な場合は、ようさんの以下記事をご一読ください。

https://yo-yon.hatenablog.com/entry/powerapps2024241208

## おまけ：エラーチェックでよく使う関数/プロパティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/af4d991a-df01-bc4d-31d0-eff43b38f5ce.png)

## 参考

- [入力フォームにおけるUI設計の基本とUXを改善するためのデザインルールとは？](https://act-3.biz/form-ui-parts)
- [入力フォームにおけるエラーデザイン](https://baigie.me/blog-ui/2022/04/21/error_design/)
- [[UI/UX] バリデーションの発火タイミングとボタン制御について](https://qiita.com/bmjuggler/items/2e1803cc42c828701594)
- [PowerApps 入力チェックについての考察](https://qiita.com/yamad365/items/a562e2272ca18dd22967)

### 元記事

https://powerplatformnikki.com/validationcheck/