そのデータ、もうあります!Power Appsで既存データの重複登録を事前に防ぐ

同じ社員番号が2件登録されていた、そのせいでVLOOKUPが意図しない行を返し、給与計算がおかしくなった。そんなトラブルを経験したことはないでしょうか。Power Appsで重複登録を防ぐには、LookUp関数を使った事前チェックが効果的です。入力ミス防止の設計全体についてはPower Apps入力ミス防止ガイドでまとめているので、あわせて参考にしてください。

この記事では、LookUp関数でデータの重複を判定し、送信ボタンをDisabledにするガードレールの作り方を解説します。さらに応用として、自己割り当て禁止(ログインユーザー自身を担当者に選べないようにする)パターンも紹介します。

重複登録が引き起こす現場の問題

取引先管理アプリに同じ会社名が複数登録されると、担当者ごとに異なるレコードを更新してしまい、情報が分断されます。社員番号の重複なら給与・人事データへの影響は深刻です。発覚するのが後になればなるほど、修正のコストが跳ね上がります。

問題は、Power Appsの標準フォームには重複チェック機能が内蔵されていないことです。SubmitForm関数でSharePointに保存する際、既存データと同じ値であっても構わず書き込んでしまいます。防ぐには自分で判定ロジックを組み込む必要があります。

一応私は社内でPower Platformを教える立場なので、新しくアプリを作る人から、気づいたら同じデータが2件あるという相談をよく受けます。ほぼ毎回、重複チェックが実装されていないことが原因です。

LookUp関数で既存データの存在を確認する

LookUp関数は、データソースから条件に一致する最初のレコードを返す関数です。一致するレコードがなければblankを返すので、IsBlankと組み合わせることで重複の有無を判定できます。LookUp関数の基本的な使い方については別記事で詳しく解説しているので、関数の構文に不安がある方は先に確認しておくと理解が深まります。

基本的な判定式は次のとおりです。

!IsBlank(LookUp(社員マスター, 社員番号 = TextInput_EmpNo.Text))

この式は、社員マスターに同じ社員番号が存在する場合にtrueを返します。falseなら重複なし、trueなら重複ありです。

送信ボタンをDisabledにして登録をブロックする

重複チェックの結果を送信ボタンのDisplayModeプロパティに反映させます。重複が検出された場合は送信できないようにします。

If(
    !IsBlank(LookUp(社員マスター, 社員番号 = TextInput_EmpNo.Text)),
    DisplayMode.Disabled,
    DisplayMode.Edit
)

これで、既存の社員番号が入力されている間はボタンが押せなくなります。ボタンは非表示にするのではなく、Disabledのまま表示し続けることが重要です。消してしまうとユーザーがどこに保存ボタンがあるか分からなくなります。

エラーメッセージで理由を伝える

送信ボタンがグレーアウトするだけでは、なぜ送れないかユーザーが分かりません。入力フィールドの直下にラベルコントロールを配置し、重複検出時のみ表示させます。

ラベルのVisibleプロパティに次の式を設定します。

!IsBlank(LookUp(社員マスター, 社員番号 = TextInput_EmpNo.Text))

ラベルのTextプロパティには この社員番号はすでに登録されています という文言を設定し、Colorプロパティは赤にします。これで、重複があるときだけ入力欄のすぐ下に赤いメッセージが表示されます。

委任の警告に注意する

LookUp関数はSharePointやDataverseに対して委任可能な関数ですが、フィルター条件によっては委任の警告が出ることがあります。特に文字列の完全一致(=)は委任されますが、関数を使った変換(例:Lower関数で大文字小文字を無視する)は委任できないことがあります。

委任については委任の警告と対処法の記事で詳しく解説しています。大量データを扱うアプリでは、委任可能な書き方になっているかを必ず確認してください。500件を超えるデータで先頭500件しか検索されない状態だと、重複チェックとして機能しなくなります。

応用:自己割り当て禁止のバリデーション

重複チェックの発想を応用すると、ログインユーザー自身を担当者に選べないようにするバリデーションも実装できます。例えば、承認フローで申請者と承認者が同じ人にならないようにする制御です。

ドロップダウンで担当者を選ぶ場合、選択したユーザーのIDとログインユーザーのIDを比較します。Office365Usersコネクタを使えばログインユーザーのIDを取得できます。

If(
    Dropdown_Approver.Selected.Id = Office365Users.MyProfileV2().id,
    DisplayMode.Disabled,
    DisplayMode.Edit
)

自分自身のIDが選択されている間は送信ボタンがDisabledになり、承認者に自分を指定した状態での送信を防げます。モダンコントロールのドロップダウンでは、ValidationStateプロパティを使った別の実装方法もあります。

If(
    And(varFormSubmitted, Self.Selected.Id = Office365Users.MyProfileV2().id),
    "Error",
    "None"
)

varFormSubmittedは送信ボタンを押したタイミングでtrueに変える変数です。この方法だとフォームの送信を試みたときにだけエラーが発動するので、最初から赤枠が出てユーザーを混乱させることがありません。

まとめ

重複チェックの実装はシンプルです。LookUpで既存レコードを検索し、IsBlankで存在確認、結果を送信ボタンのDisplayModeとエラーラベルのVisibleに反映させる。この3ステップで、ユーザーが気づかないまま重複データを登録してしまう事故をほぼ防げます。

データが壊れてから直すより、入口で守る方がずっと楽です。フォームを作るたびに重複チェックをセットで入れる習慣にすると、後から泣くことが格段に減ります。

Xでフォローしよう