Salesforceのリードと取引先責任者の重複レコードを一括マージする方法
データ重複、ツラい
Salesforce運用している方にとって、必ず通る道ですよね。
システムの都合で取引先責任者にインポートした結果、すでに同じ人物が存在していて重複が起きてしまう、など。
取引先責任者/リード同士の重複であれば手作業でも2ステップでマージできますが、リード/取引先責任者の重複は、一度リードを取引先責任者に変換してからマージする必要があります。
今回は重複の中でもっとも面倒なリード/取引先責任者のマージについて、メールアドレスをキーにして一括で変換、マージする方法をご紹介します。
一致/重複ルールの設定
ルール設定については、Salesforce標準のルールを使ってもらって大丈夫です。この設定で重複レコード判定を行います。
実行コード
(使い捨てのコードなので、見栄えはご了承をmm)
まずはじめに重複レコードを取得します。重複レコードは「DuplicateRecordItem」オブジェクトに作成されます。
//重複ルールに該当するレコードを取得
List<DuplicateRecordItem> records = [SELECT RecordId FROM DuplicateRecordItem];
次に重複レコードのレコードID(リードID)を使って、リードを取得します。
Set<Id> ids = new Set<Id>();
for(DuplicateRecordItem d : records){
ids.add(d.RecordId);
}
//重複に引っかかったリードを取得
List<Lead> leads = [SELECT Id, Email, Status FROM Lead WHERE Id = :ids limit 150];
System.debug('leads:' + leads.size());
次に同じレコードID(取引先責任者ID)を持った取引先責任者を取得します。
今回は処理を軽くするため、メールアドレスをkeyにしてMapに格納しました。
//重複に引っかかった責任者取得
List<Contact> contacts = [SELECT Id, AccountId, Email FROM Contact WHERE Id = :ids];
//メールアドレスをキーにMap変換
Map<String, Contact> contactMap = new Map<String, Contact>();
for(Contact con : contacts){
contactMap.put(con.Email, con);
}
System.debug('contactMap:' + contactMap.size());
次にリードのメールアドレスと、先程作成した責任者Mapのメールアドレスを比べて、一致した場合は取引先責任者に変換、マージする処理を行います。「LeadConvert」オブジェクトを作成することで、Apex上からリードを取引開始済みに変更することができます。詳しい使い方はSalesforce公式ヘルプページに載っています。
for(Lead l : leads){
//責任者で同じメールアドレスを持ってたら、LeadConvertオブジェクト作成
if (contactMap.containsKey(l.Email)){
//取引開始済みリードオブジェクトを作成
Database.LeadConvert lc = new Database.LeadConvert();
//リードを設定
lc.setLeadId(l.Id);
//取引開始後の状況を設定
lc.setConvertedStatus(l.Status);
//マージ先の取引先を設定
lc.setAccountId(contactMap.get(l.Email).AccountId);
//マージ先の取引先責任者を設定
lc.setContactId(contactMap.get(l.Email).Id);
//商談オブジェクトを作成しない※これを忘れると変換した分だけ商談が作成されてしまうので注意
lc.setDoNotCreateOpportunity(True);
//取引開始
try{
Database.LeadConvertResult lcr = Database.convertLead(lc);
System.debug('変換したリード:' + l.Id);
}catch(DmlException e){
System.debug('エラー:' + e);
}
}
}
全てまとめると↓になります。
/**
* メールアドレスをkeyにした重複マージ
*/
//重複ルールに該当するレコードを取得
List<DuplicateRecordItem> records = [SELECT RecordId FROM DuplicateRecordItem];
Set<Id> ids = new Set<Id>();
for(DuplicateRecordItem d : records){
ids.add(d.RecordId);
}
//重複に引っかかったリードを取得
List<Lead> leads = [SELECT Id, Email, Status FROM Lead WHERE Id = :ids limit 150];
System.debug('leads:' + leads.size());
//重複に引っかかった責任者取得
List<Contact> contacts = [SELECT Id, AccountId, Email FROM Contact WHERE Id = :ids];
//メールアドレスをキーにMap変換
Map<String, Contact> contactMap = new Map<String, Contact>();
for(Contact con : contacts){
contactMap.put(con.Email, con);
}
System.debug('contactMap:' + contactMap.size());
for(Lead l : leads){
//責任者で同じメールアドレスを持ってたら、LeadConvertオブジェクト作成
if (contactMap.containsKey(l.Email)){
//取引開始済みリードオブジェクトを作成
Database.LeadConvert lc = new Database.LeadConvert();
//リードを設定
lc.setLeadId(l.Id);
//取引開始後の状況を設定
lc.setConvertedStatus(l.Status);
//マージ先の取引先を設定
lc.setAccountId(contactMap.get(l.Email).AccountId);
//マージ先の取引先責任者を設定
lc.setContactId(contactMap.get(l.Email).Id);
//商談オブジェクトを作成しない※これを忘れると変換した分だけ商談が作成されてしまうので注意
lc.setDoNotCreateOpportunity(True);
//取引開始
try{
Database.LeadConvertResult lcr = Database.convertLead(lc);
System.debug('変換したリード:' + l.Id);
}catch(DmlException e){
System.debug('エラー:' + e);
}
}
}
こちら参考にバッチ処理として実装、ライトに反映させたい場合は開発コンソール上から実行してみてください。
これで150件ずつマージされていきます!
重複レコードのマージは手作業で行うとかなり大変ですが、Apexを上手く活用すれば効率的に処理することができます。ぜひチャレンジしてみてください。
データ整備でお困りの場合はアドバイスできますので、お気軽にご相談ください。
この記事が気に入ったらサポートをしてみませんか?