見出し画像

Salesforceのリードと取引先責任者の重複レコードを一括マージする方法

データ重複、ツラい

Salesforce運用している方にとって、必ず通る道ですよね。
システムの都合で取引先責任者にインポートした結果、すでに同じ人物が存在していて重複が起きてしまう、など。
取引先責任者/リード同士の重複であれば手作業でも2ステップでマージできますが、リード/取引先責任者の重複は、一度リードを取引先責任者に変換してからマージする必要があります。

今回は重複の中でもっとも面倒なリード/取引先責任者のマージについて、メールアドレスをキーにして一括で変換、マージする方法をご紹介します。

一致/重複ルールの設定

ルール設定については、Salesforce標準のルールを使ってもらって大丈夫です。この設定で重複レコード判定を行います。

画像1

実行コード

(使い捨てのコードなので、見栄えはご了承を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);
   }
 }
}

こちら参考にバッチ処理として実装、ライトに反映させたい場合は開発コンソール上から実行してみてください。

画像2

これで150件ずつマージされていきます!

重複レコードのマージは手作業で行うとかなり大変ですが、Apexを上手く活用すれば効率的に処理することができます。ぜひチャレンジしてみてください。
データ整備でお困りの場合はアドバイスできますので、お気軽にご相談ください。

この記事が気に入ったらサポートをしてみませんか?