皆さんはSalesforceの「フロー」を活用されていますでしょうか。
最近は機能がどんどん拡充され、画面フローを使ってユーザーに情報を入力してもらい、レコードの作成や更新を行う仕組みを構築する機会も増えてきましたよね。
しかし、画面フローを運用する中で、以下のような「入力規則」に関する課題に直面したことはないでしょうか。
- オブジェクト側で設定した「入力規則」に引っかかった際、画面に英語混じりの複雑なシステムエラー(FaultMessage)が表示されてしまい、一般ユーザーが混乱する。
- 一方で、画面フローの「入力を検証」機能で一つひとつエラー条件を設定するのは、分岐が複雑でメンテナンスも大変。せっかく定義したオブジェクトの入力規則をそのまま活用したい。
そこで今回は、画面フローでレコードの作成や更新を行った際に、オブジェクト側の入力規則のエラーメッセージだけをそのまま綺麗に表示させるテクニックを調べましたので、その実装方法をご紹介します。
1. おさらい
1-1. 画面フローでエラーメッセージを表示させる
フロー内で「障害パス」を使うとエラーが発生したときの処理を定義できます。画面フローでレコードを更新してエラーが発生したときなど、エラーが発生したことをユーザーに知らせることができます。
まずはこのエラーメッセージの表示方法のおさらいをしてみましょう。
とある画面フローに以下のような「update」と名付けられた更新要素があります。

この更新要素でのレコード更新に失敗したら、エラーメッセージを画面に表示するようにしてみます。
要素の右横の縦の3点マークをクリックすると、その要素に対するアクションメニューが表示されます。そのうち一番下にある「障害パスを追加」をクリックします。

すると、更新要素の右側に赤い点線のパスが追加されます。これが障害パスと呼ばれるもので、エラーが発生したときの処理を設定することができます。今回の例では、「update」要素で何かしらの原因(入力規則への抵触や、ガバナ制限の超過など)で失敗した際に、その後の処理をどのように行うかを設定できます。

今回は、エラーが発生したことをユーザーに知らせる画面を表示したいため、障害パスの「+」から「画面要素」を追加しましょう。


コンポーネントから「表示テキスト」を選びます。

API参照名に任意の値を入力し、赤枠のテキスト入力エリアに表示したいメッセージを入力します(文字色を赤にすると、エラーメッセージであることが一目で分かりやすくなるためおすすめです)。

あとは「完了」して設定を確定させ、フロー自体の保存と有効化を行えば、エラーメッセージの設定は完了です。このフローを実行し、もし更新要素でエラーが発生すると以下のような画面が表示されます。

1-2. エラー原因を表示させる
さらに {!$Flow.FaultMessage} グローバル変数を使えば、詳細なエラー原因を表示することができます。今回のテーマである「入力規則が原因のエラー」も表示可能です。
例えばオブジェクトにこのような入力規則を用意したとします。
フロー側では、障害パスの先にある画面要素の「表示テキスト」内に {!$Flow.FaultMessage} グローバル変数を設定します。

すると、実際にエラーが発生した際には以下のようなメッセージが表示されます。

このように入力規則のエラー内容を表示することはできますが、ご覧の通り {!$Flow.FaultMessage} をそのまま使うと、ユーザーにとっては不要なシステム情報が多く、非常に分かりづらいメッセージになってしまいます。
一応、画面フローのコンポーネント内にある「入力を検証」機能を使えば、フロー側で入力チェックを行うことも可能です。しかし、エラー条件が複雑に分岐するケースでは「入力を検証」だけでの対応は困難です。何より、せっかくオブジェクト側で用意した入力規則があるのですから、それをそのまま活用できたら便利ですよね。
2. 余計な文章を省いたメッセージを表示するには
2-1. 数式変数でエラーメッセージを加工する
では、画面フロー上で余計な文章を省き、入力規則のエラーメッセージだけをきれいに表示するにはどうすればよいのでしょうか。
結論から言うと、別途「数式変数」を用意し、その中でエラーメッセージを加工(抽出)することで、入力規則のエラーメッセージだけをそのまま表示できるようになります。そのために使用する数式が以下となります。
MID(
{!$Flow.FaultMessage},
FIND("FIELD_CUSTOM_VALIDATION_EXCEPTION: ", {!$Flow.FaultMessage})
+ LEN("FIELD_CUSTOM_VALIDATION_EXCEPTION:"),
FIND("ExceptionCode", {!$Flow.FaultMessage})
- 1
- FIND("FIELD_CUSTOM_VALIDATION_EXCEPTION: ", {!$Flow.FaultMessage})
- LEN("FIELD_CUSTOM_VALIDATION_EXCEPTION:")
)
この数式の仕組みを説明します。
加工していない状態の入力規則エラーメッセージ(FaultMessage)を確認すると、表示させたいエラー内容が必ず「FIELD_CUSTOM_VALIDATION_EXCEPTION:」と「。ExceptionCode」の間に挟まれていることが分かります。
フローで次のレコードの更新が試行されました: a05GA00001XaB1dYAF。次のエラーが発生しました: FIELD_CUSTOM_VALIDATION_EXCEPTION: ○○項目の入力ミスがあります。。ExceptionCode の値については、『SOAP API 開発者ガイド』を参照してください。
これはSalesforce側が決まった形で出力しているため、(Salesforce側がこの決まりを変えない限り)必ずこのルールでメッセージが生成されます。そこに着目し、MID関数、LEN関数、FIND関数を組み合わせて、必要な文字列だけをピンポイントで抜き出しています。
2-2. 用意した数式変数を設定する
それでは、実際に設定してみましょう。「新規リソース」から「数式」を選択します。

API参照名を設定します。今回は「ErrorMessage」という名称にします。

数式欄には先ほど紹介した数式を貼り付け、完了ボタンを押します。

次に、1-2で設定した画面要素内の {!$Flow.FaultMessage} を今作成した数式変数 {!ErrorMessage} に差し替えます。

差し替え終わったら、フローを「保存」または「新しいバージョンとして保存」し、最後に忘れずに「有効化」します。
それでは有効化した状態で、再度画面フローを動かしてみましょう。レコード更新時に入力規則エラーになると、以下のようなメッセージが表示されます。

余計な文章が消え、入力規則のエラーメッセージだけを綺麗に抜き出せていることが分かります。
3. 注意事項
この手法を活用するにあたり、以下の3点の注意事項があります。
- ① 管理者へのエラーメールが送信される
障害パスを通過すると、そのフローでエラーが発生したことを知らせる「エラーメール」が自動的にシステム管理者宛てに送信されます。今回の手法はエラー自体を回避しているわけではないため、入力規則エラーであっても毎回管理者にメールが届く点に注意してください。 - ② ユーザーの言語設定が「英語」の場合は非対応
ユーザーの言語設定が英語の場合、{!$Flow.FaultMessage} で出力されるシステムメッセージ自体が英語に翻訳されます。そのため、「FIELD_CUSTOM_VALIDATION_EXCEPTION:」や「。ExceptionCode」の位置や文字列が変わり、数式が正しく機能しません。英語環境でも対応させたい場合は、別途多言語対応の工夫が必要となります。 - ③ Salesforceの仕様変更の影響を受ける可能性がある
先述の通り、この数式は「エラーメッセージが特定の文字列の間に挟まれている」というSalesforceの現在の出力仕様に依存しています。将来的にSalesforce側のエラー出力形式が変更された場合、数式が正しく動作しなくなる可能性があるため、その際は数式の見直しが必要です。
4. 終わりに
いかがだったでしょうか。
少しテクニカルな内容ではありますが、使いこなせばユーザーの利便性を大きく向上させられる便利なテクニックです。画面フローの構築でエラーメッセージの表示に悩まされていた方は、ぜひ活用してみてください。




