Salesforceの重複管理機能とは、重複した内容のレコードが発生することを防ぐ機能です。
この機能を利用する際、一致ルールと重複ルールを正しく設定しないと動作しないケースがあります。今回は、重複管理機能が設定通りに動作しない4つケースについて仕様や解決策をご紹介いたします。
重複管理機能とは
まずは重複管理機能について簡単な説明と設定例、重複が発生した場合の基本的な動きについておさらいします。
重複管理機能とは、重複した内容のレコードが発生しないように①重複とみなす条件を定め、②重複が発生した場合はどのような処理を行うか決めることができる機能です。
そして重複管理機能は以下の2つのルールで構成されています。
・一致ルール
・重複ルール
これらについて解説していきます。
一致ルール
一致ルールとは、どの項目の値が重複してはいけないか条件を定めるルールです。一致と認識するパターンとして「完全一致」か「あいまい一致」を選ぶことができます。
重複ルール
レコードの重複が発生した場合の、保存時の動作を定めるルールです。アラートを挟んだ上で保存することを許可したり、そもそも保存をブロックしたりできます。予め一致ルールを用意したうえで、どの一致ルールを使って重複と認識するかを設定します。
重複管理機能の設定例
取引先と取引先責任者に対し、重複管理機能を設定してみます。詳しい手順は公式ヘルプをご確認ください。またこの後の検証でも今回設定する重複管理機能を使用するため、標準で予め用意されている重複管理機能はすべて無効化しております。
例:重複を『ブロック』する設定
まずは重複レコードの保存を『ブロック』するように設定してみましょう。取引先に対して設定を行っていきます。
まずは一致ルールの設定です。
『取引先の”取引先名”が完全一致する』ように設定したいと思います。設定内容は以下の通りです。
①「項目」には『取引先名』を選択。
②「一致メソッド」には『完全』を選択。

次は重複ルールの設定です。以下の内容で設定しました。
①「作成時のアクション」と「編集時のアクション」にそれぞれ『ブロック』と設定。
この場合は重複するレコードが存在すると保存ができなくなります。
②「一致ルール」には、先ほど用意した『取引先の”取引先名”が完全一致する』ルールを選択しました。

それでは重複を『ブロック』するように設定した場合、どのような動きとなるか確認してみましょう。
取引先にはすでに「ABC株式会社」というレコードがあります。

新規ボタンを押して「取引先名」に『ABC株式会社』と入力し、フォーカスアウトします。

すると、「重複しているレコードがあるので保存できません」という旨のアラートが表示されます。

保存ボタンを押しても同じアラートが表示されて保存はできないことが確認できました。

例:重複を『許可』する設定
次に重複が発生した場合はアラートを表示させ、保存自体は『許可』するように設定してみます。
今度は取引先責任者に対して設定していきましょう。
まずは一致ルールの設定です。
一致ルールは『取引先責任者の “姓”が完全一致する かつ “名”が完全一致する』という条件を設定したいと思います。設定内容は以下の通りです。
①1行目の「項目」には『名』を選択。
②『名』に対する「一致メソッド」として『完全』を選択。
③2行目の「項目」には『姓』を選択。
④『姓』の「一致メソッド」にも『完全』を選択。

次に重複ルールの設定です。以下の内容で設定しました。
①「作成時のアクション」と「編集時のアクション」に『許可』と設定しました。
この場合は重複したレコードがあっても保存することができます。
②「作成時の動作」と「編集時の動作」 には『アラート』へチェックを付けました。
これで保存前に、重複レコードを保存してもよいか確認するアラートが表示されるようになります。
なお、『レポート』にチェックを付けると重複レポートが作成されるようになります。
③「一致ルール」には先ほど用意した、
『取引先責任者の “姓”が完全一致する かつ “名”が完全一致する』ルールを選択しました。

それでは動作確認してみましょう。
取引先責任者には「田中 太郎」というレコードがあります。

新規ボタンをクリックします。そして「姓」に『田中』、「名」に『太郎』と入力した後フォーカスアウトします。

すると、下記のキャプチャのように、重複しているレコードがあるから保存する前に確認してというアラートが表示されます。

アラートを無視して保存ボタンを押すと保存できます。
そして潜在的な重複コンポーネントには重複しているレコードがある旨の表示がされます。

以上が重複管理機能の設定方法と動作の簡単な例となります。
重複管理機能が設定通りに動かない4つのケース
これまで基本的な重複管理機能の設定方法と動作の確認をしました。
改めて基本的な動作は以下の通りとなります。
- 重複を『ブロック』と設定:重複しているレコードがあると保存できない
- 重複を『許可』と設定 :重複しているレコードがあっても保存ができる
しかし前置きで触れたように、公式のヘルプ記事によれば重複管理機能が設定通りに動かないケースが4つあります。それが以下の4ケースとなります。
No. | レコードの保存方法 | 想定外となる重複管理機能の挙動 | |
1 | 1. インポートウィザードによる作成、更新 | → | 重複を『許可』と設定しても必ずブロックされる |
2 | データローダによるレコードの挿入、更新 | → | 重複を『許可』と設定しても必ずブロックされる |
3 | ワークフロールールによる項目自動更新 | → | 重複を『ブロック』と設定しても無視して保存される |
4 | プロセスビルダーによるレコード更新 | → | 重複を『許可』と設定しても必ずブロックされる |
つまり、上記の4つのレコードの保存方法によっては
①重複を『許可』と設定したにも関わらず、必ず重複エラーが発生して保存できない!
というケースが発生したり、逆に
②重複を『ブロック』と設定したにも関わらず、素通りして保存できてしまう!
というケースが発生したりと、意図した設定内容とは異なる動作をしてしまう可能性がある、ということです。
それでは、4ケースそれぞれの動作について確認していきましょう。
1.インポートウィザードによる作成、更新
重複管理機能で重複を『許可』と設定した場合、本来ならば重複してもよいか確認アラートが出ますが、レコードの保存自体は可能です。
しかしインポートウィザードでレコードを作成/更新しようと場合、
重複を『許可』と設定していても必ずエラーとなり、レコードを保存できません。
実際にどのような動きとなるか、試しに先ほど重複を『許可』と設定した取引先責任者に対して、インポートウィザードを使ってレコードのインポートを実施してみましょう。
このようなcsvを用意しました。姓にあたる「LastName」には『田中』、名にあたる「FirstName」には『太郎』と入れてあります。

これをデータインポートウィザードでインポートしてみようと思います。

『取引先と取引先責任者』を選択して先に進めます。

投入するcsvファイルを選択して「次へ」進めると、項目の対応付けが表示されます。
間違ってないことを確認して、さらに進めます。

内容を確認して「インポートを開始」。

するとこのようなメッセージが表示されます。一見成功したかに見えますが・・・

「OK」をクリックすると結果画面が表示されます。
よく見るとレコードの失敗に『1』と記載されていることが確認できます。
さらに「結果を表示」から実行結果が記載されたcsvをダウンロードできるので確認してみましょう。

ファイルの内容を見てみると、エラーメッセージには取引先責任者の重複ルールで設定したアラートメッセージが表示されています。このことから、重複管理機能が原因でインポートに失敗していることが分かります。

2. データローダによるレコードの挿入、更新
データローダもインポートウィザードと同様、
重複を『許可』と設定しても必ずエラーとなり、レコードを保存できません。
こちらのケースも重複を『許可』と設定した取引先責任者でどのように動くか試してみましょう。
先ほどの取引先責任者csvファイルを使用して、Insertしてみます。

Insert → 『取引先責任者』を選択。

項目の対応付けをして実行します。

すると、実行結果にエラーが1件あると表示されました。

エラーログを確認すると取引先責任者の重複ルールで設定したアラートメッセージが記載されており、
重複管理機能が原因でInsertにエラーが生じたことが分かります。

3. ワークフロールールによる項目自動更新
ワークフロー項目自動更新の場合、先ほど試したインポートウィザードやデータローダとは異なった動作をします。というのも、本来なら重複管理機能で重複を『ブロック』とした設定した場合、レコードの保存ができないのですが、ワークフロー項目自動更新の場合は
重複を『ブロック』と設定していても、その設定を無視してレコードの保存ができます。
それでは先ほどの設定例にて重複を『ブロック』と設定した、取引先に対して項目自動更新を設定して試してみましょう。
このような項目自動更新を用意しました。
「取引先名」を強制的に『ABC株式会社』と設定する処理となっています。

この項目自動更新をワークフロールールへ設定し、有効化します。
ワークフロールールは作成/編集したらいつでも起動するよう設定しました。

それでは取引先を新規作成してみましょう。
「取引先名」には『(株)DEF』と重複しない値を入れて保存します。

すると、すでに「ABC会社」があるにも関わらず、項目自動更新が発動して新しく「ABC会社」が作成されました。
灰色のトーストには「この取引先と重複しているレコードが存在している」と表示され、
潜在的な重複コンポーネントには重複しているレコードがある旨の表示がされています。

灰色のトーストの「重複を表示」をクリックすると、重複しているレコード一覧を確認できます。内容を確認してみると確かに「ABC株式会社」というレコードが重複して存在しています。

4. プロセスビルダーによるレコード更新
このケースが私が前置きで遭遇した例です。すなわち、本来なら重複を『許可』と設定した場合はレコードの保存自体は可能ですが、プロセスビルダーでの更新の場合は
重複を『許可』と設定しても必ずエラーとなり、レコードを保存できません。
こちらも本当にレコードを保存できないのか、重複を『許可』と設定した取引先責任者で再び試してみましょう。
プロセスビルダーを設定していきます。
対象に『取引先責任者』を選択し、起動タイミングを作成と編集時ともに動くようにします。

条件は『アクションを実行する条件がない』を選びます。

ルール適用時のアクションは『レコードを更新』を選択。
新しい項目値の設定には、「姓」に『田中』、「名」に『太郎』を設定します。

最後にプロセスの有効化します。

それでは取引先責任者を作成してみましょう。
「姓」と「名」には重複しないような値を入力してから保存してみます。

すると、先ほどのプロセスビルダーでエラーが発生して保存できませんでした。
すなわち、プロセスビルダーの更新アクションで「姓」を『田中』、「名」を『太郎』と更新しようと試みたものの、失敗したということになります。
エラーメッセージには取引先責任者の重複ルールで設定したアラートメッセージが記載されており、
取引先責任者の重複管理機能がエラーの原因となっていることが分かります。

おわりに
皆さん、いかがだったでしょうか。
レコードの更新の仕方によって、重複を『許可』と設定してもエラーが出て保存できないケースと、重複を『ブロック』と設定しても保存ができてしまうケースがある、ということがお分り頂けたかと思います。
特に注意したいのは、ユーザの目の見えないところでレコードが更新される3.ワークフロールール項目自動更新と4.プロセスビルダーでの更新です。
3.項目自動更新の場合は、重複を『ブロック』と設定しても保存ができてしまうので、知らず知らずのうちに重複レコードが貯まっていってしまう可能性があります。
4.プロセスビルダーの場合はユーザが見えないところの更新処理でエラーが発生するので、見かけ上問題なさそうなのにレコードを保存しようとしても、なぜか保存できないという事態が起こり得ます。
重複管理機能を設定しているオブジェクトで自動化処理も設定するときは、細心の注意を払うよう心がけましょう。
なお、今回参考にしたヘルプには記載していないレコード更新方法もまだまだあります。機会があれば本稿で紹介した4つのケース以外でも、レコードを更新した際に重複管理機能がどのような動作をするのか調べられたらと思います。
参考資料
公式ヘルプ:重複管理の動作