全角で打たないで…を防ぐ!Power Appsで全角半角の混在や不要な空白を自動制御する方法

全角で打たないでほしい。現場でそう思ったことはありませんか。Power Appsでフォームを作ったはいいものの、入力されたデータを後でExcelに取り込んだらVLOOKUPがことごとくエラー。原因を調べると、ある人は全角スペース、ある人は全角英数字で名前を入力していた。そんな経験が私にも何度もあります。

この記事では、Power Appsで全角・半角の混在や不要なスペースを自動制御する方法を解説します。IsMatch関数とTrim関数を組み合わせれば、入力ミスを保存前に食い止めることができます。

なぜ全角半角の混在が問題になるのか

Power Appsのフォームから入力されたデータは、SharePointリストやExcelシートに保存されます。このとき、VLOOKUPやCOUNTIFといった集計関数は文字の一致判定が厳密で、全角のAと半角のAは別の文字として扱われます。

例えば、20人の営業担当がそれぞれ日報を入力するアプリを想像してください。担当者名を手入力する欄があれば、ある人は全角で入力し、ある人は半角で入力します。月に400件、半年で2,400件のデータが蓄積されたとき、Excel側でピボットを組もうとして同じ人の集計値がバラバラに出てくる。これは実際によくある話です。

問題はデータが登録された後では修正が大変なことです。入力時点で制御するのが最も効率的です。

IsMatch関数で全角文字をリアルタイム検知する

Power AppsのIsMatch関数は、入力値が指定したパターンに一致するかどうかをtrue/falseで返す関数です。正規表現を渡すことができるので、半角英数字以外の文字が含まれているかどうかを判定できます。

BorderColorを使った視覚フィードバック

最もシンプルな実装は、テキスト入力コントロールのBorderColorプロパティをIsMatchの結果に連動させる方法です。半角英数字以外が入力されたときに枠線を赤くすることで、ユーザーに即座に気づかせることができます。

テキスト入力コントロールのBorderColorプロパティに次の数式を設定します。

If(
    IsMatch(TextInput1.Text, "^[a-zA-Z0-9!-/:-@\[-`{-~\s]*$"),
    RGBA(0, 0, 0, 1),
    RGBA(255, 0, 0, 1)
)

正規表現の意味は、先頭から末尾まで半角英数字・記号・スペースのみで構成されているかどうかを判定するものです。全角文字が1文字でも含まれていれば条件に一致しなくなるため、枠線が赤くなります。

送信ボタンを無効化してデータ汚染を防ぐ

枠線の色を変えるだけでは、ユーザーが気づかないまま送信してしまう可能性があります。確実にデータ汚染を防ぐには、送信ボタンのDisplayModeプロパティをIsMatchの結果で制御するのが有効です。

送信ボタンのDisplayModeプロパティに次のように設定します。

If(
    IsMatch(TextInput1.Text, "^[a-zA-Z0-9!-/:-@\[-`{-~\s]*$"),
    DisplayMode.Edit,
    DisplayMode.Disabled
)

全角文字が入力されている間はボタンがグレーアウトして押せなくなります。ボタンは常に表示したままDisabledにするのがポイントです。非表示にしてしまうと、ユーザーが保存方法を見失ってしまいます。

Trim関数でコピペ由来の不要スペースを除去する

全角半角の問題とは別に、コピペ操作による末尾スペースも集計ミスの原因になります。見た目では気づかないのに、VLOOKUPがエラーになってしまう。その犯人がこの見えない空白です。

Power AppsのTrim関数とTrimEnds関数は、文字列から余分なスペースを取り除きます。TrimとTrimEndsの違いを簡単にまとめると、Trimは文字列の先頭・末尾・単語間の余分なスペースをすべて除去するのに対し、TrimEndsは先頭と末尾のスペースだけを除去します。コピペ時の末尾スペース対策にはTrimEndsで十分なことが多いです。

保存時にTrimEndsで自動クリーニングする

ユーザーに気づかせずに自動でスペースを除去するには、Patchで保存する際にTrimEndsで値を包む方法がシンプルです。

Patch(
    '担当者リスト',
    Defaults('担当者リスト'),
    {
        担当者名: TrimEnds(TextInput1.Text),
        電話番号: TrimEnds(TextInput2.Text)
    }
)

入力フォームに保存ボタンがあり、そのOnSelectプロパティにPatchを書いている場合は、このように各フィールドをTrimEndsで囲むだけです。ユーザーは意識しなくてよく、保存されるデータは常にクリーンな状態になります。

DelayOutputで入力中のストレスを減らす

IsMatchを使ったリアルタイムチェックは便利ですが、1文字入力するたびに枠線が赤くなるとユーザーがイライラすることがあります。例えば電話番号を入力中に最初の1桁を打った瞬間から赤くなれば、入力途中なのにエラー扱いされている気分になります。

この問題を解決するのがDelayOutputプロパティです。テキスト入力コントロールのDelayOutputプロパティをtrueに設定すると、入力が止まってから約1秒後に値の再評価が行われます。タイプ中に即座にエラーが出るのを防ぎ、入力が落ち着いてから判定するUX設計になります。

設定は簡単で、テキスト入力コントロールのDelayOutputプロパティをtrueにするだけです。デフォルトはfalseなので、リアルタイムバリデーションを使う場面では積極的にtrueにすることをおすすめします。

実装パターンの組み合わせ方

ここまでで紹介した方法は、組み合わせて使うのが実践的です。個人的には次の組み合わせをよく使います。

  1. DelayOutputをtrueにして入力中のチラつきを防ぐ
  2. BorderColorをIsMatchで赤/黒に切り替えて視覚フィードバック
  3. 送信ボタンのDisplayModeをIsMatchで制御してデータ汚染ブロック
  4. Patchの際にTrimEndsで末尾スペースを自動除去

この4つをセットで設計しておくと、全角入力も末尾スペースも保存されることがありません。フォームを作るたびに同じ設計を踏襲するようにしたところ、社内でデータの集計ミスがほぼなくなりました。

なお、IsMatchの正規表現については、テキスト関数ピラー記事でも関連する文字列操作の関数をまとめているので、合わせて参考にしてください。また、入力フォームのバリデーション設計全体については、必須チェックとエラーメッセージの作り方の記事で詳しく解説しています。バリデーション全体の設計思想については、コンテナ完全ガイドでもUI/UX観点から触れています。

まとめ

Power Appsで全角半角の混在や不要スペースを防ぐには、IsMatch関数とTrim関数の組み合わせが効果的です。IsMatchで全角文字を検知して送信ボタンをDisabledにし、保存時にTrimEndsで末尾スペースを除去する。この設計を入れておくだけで、後から集計がつらくなる状況をかなり防げます。

データの整備を後からやるのは、作り直すのと同じくらい大変です。入力時点で正しいデータを作る設計に、最初から投資するのが結果的には早いです。市民開発とはそういう地道な積み重ねだと思っています。

入力エラーに関する一覧はこちらの記事をご覧ください。

Xでフォローしよう