Salesforce Flowで商談の重複登録を防いでみようという話
背景と最初の違和感
Salesforceで商談を作ってると、「あれ?これ前にも作った気が...」みたいな場面ありませんか?
ユーザーが自由に入力できる商談名(Name)は、ちょっとしたスペースや全角・半角の違いだけで別物として保存されてしまいます。
たとえばこんなケース:
- "ABCテスト案件"
- " ABCテスト案件"
- "A B C テ ス ト 案 件"
見た目は同じ、でも中身は別レコード。これ、厄介ですよねー…。登録担当者が複数いたりすると時期違いで重複登録してしまう事があると報告を受けました。
最初に考えたのは標準機能
Salesforceには"重複ルール(Duplicate Rule)"って便利な機能があります。最初はこれでどうにかなるかな?と思って試しました。
ただ、うまくいかない。
- そもそも、重複チェックできるオブジェクトには限りがあり、Opportunityは対象外。
- 完全一致やあいまい一致の指定はできるけど、「スペース除いた比較」みたいなことはできない
- 商談名のような自由記述項目の一致って、定義が難しい
結論、標準機能では無理があるな… ということで、Flowで自前チェックを作る方向に切り替えました。
Flowでやってみたけど、すんなりはいかず
よーしFlowだ!と意気込んで作ったのがこんな流れ:
- 商談が作成されたら起動(保存前)
- 同じ商談名のレコードがあるか
Get Records
で検索 - 見つかれば カスタムエラー でブロック
シンプルなはず。でも思ったように動かない。
-
$Record.Id
は保存前だと null → 自分自身の除外ができない - 「nullではない」「空白ではない」といった比較演算子が選べないUIの罠
- 一見一致してるように見えて、
Get Records
がヒットしない
完全一致じゃ拾いきれない問題にぶち当たりました。
スペースの有無を除外してみる
ならいっそ、比較前に「商談名を正規化」して比べたらどうだろう?という発想に。
つまり、余計な空白や全角スペースを削除してしまおうということです。
Name_Cleaned__c を作る
商談オブジェクトに数式項目 Name_Cleaned__c
を作って、こんな式を入れました:
SUBSTITUTE(SUBSTITUTE(TRIM(Name), " ", ""), " ", "")
これで、「ABC テスト」も「 ABCテスト」も「ABCテスト」になります。
Flowの構成を作り直す
入力値も正規化
Flowの中で $Record.Name
を同様に処理するため、数式リソースを作成:
SUBSTITUTE(SUBSTITUTE(TRIM({!$Record.Name}), " ", ""), " ", "")
名前は NormalizedInputName
にしました。
Get Records の検索条件をこう変える
これで、「正規化された値同士」での一致が可能に。
テストでようやくブロック成功!
最初のうちはエラーが出たり、想定通りに動かなかったり。
でも、以下の構成で安定しました:
- フローは「保存前(高速項目更新)」で起動
-
Get Records
で1件でもヒットしたらカスタムエラーを発動
テスト結果
入力 | 正規化後 | 登録可否 |
---|---|---|
" ABC テスト案件" | "ABCテスト案件" | ❌ ブロック |
"ABCテスト案件 -2" | "ABCテスト案件-2" | ❌ ブロック |
他にも使えるかも?
この考え方、他のオブジェクトや場面にも応用できます。
- 取引先、リード、案件名など「自由入力フィールド」の正規化チェック
- バリデーションルールとの組み合わせ
- Flowをテンプレ化して再利用
「Name_Cleaned__c」のような正規化済み項目を作るだけで、目に見えない重複の芽を摘めます。
まとめ
そもそも私がSalesforceを知らなくて商談名を重複登録させない設定ってどこかにあるんでしょうか?
また、ほんとはユニークになる情報を埋め込めればいいのですが、同じ商談で使用する日付周りも完全一致しない場合があると言われて、苦肉の策でこんな簡易チェックをいれることになりました。
似たように「完全に弾けないけど、多少でも使えれば…!」という方がいればご参考に^^