商談レコードを複製する時に商談チームも複製する

元の質問 : [商談レコードコピー時に商談チームも引き継ぎたい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdnyGSAR) 

# 複製時に元の商談オブジェクトのIdを保存するにはどうするか？

+ [ページ レイアウトにないフィールドのフィールド値はコピーされません。](https://help.salesforce.com/s/articleView?id=000322210&type=1)

単純に元のIdというカスタムフィールドを作った場合。保存時にブランクなら自分自身を入れておく？
複製した場合には複製元がコピーされるかな？

実際にやってみたら、カスタムフィールドに値が入っていたら複製できるようです。
とすると、このフィールドがブランクの時には自分自身のIdを保存しておけばいい。

複製として作成された場合はこのフィールドがブランクでなかったら商談チームを複製する処理を走らせれば出来るかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ebf0fc78-7567-b50f-f750-879af70bb400.png)

# 結果

Apexトリガーを実装すればできました。
ポイントとしては Map<Id,List<OpportunityTeamMember>> oppTeamMap に元々も商談のチーム情報を元々の商談のIdをキーにして作成しておきます。
Map<Id,Id> oppMapに複製後の商談のIdと元々の商談のIdを持っておけば、この２つの変数の組み合わせで複製後の商談のIdから元々も商談のチーム情報を参照できます。
（このような使い方がフローでどうなるのかが理解できないです。そのため実際には私が管理している環境ではフローは使わないです。）


```
trigger cloneTeam on Opportunity (before insert,after insert) {
    
    //Save Source_Opp_Id__c
    if (Trigger.isBefore) {
        for (Opportunity opp : Trigger.new){
            if (opp.Source_Opp_Id__c == null) opp.Source_Opp_Id__c = opp.Id;
        }
    }
    
    if (Trigger.isAfter) {
        Map<Id,Id> oppMap = new Map<Id,Id>();
        Set<Id> OppIdSet = new Set<Id>();
        for (Opportunity opp : Trigger.new){
            if (opp.Id != opp.Source_Opp_Id__c) {
                OppIdSet.add(opp.Source_Opp_Id__c);
                oppMap.put(opp.Id,opp.Source_Opp_Id__c);
            }
            
        }
        
        List<OpportunityTeamMember> oppTeamList = [SELECT Id,OpportunityId,OpportunityAccessLevel, TeamMemberRole,UserId FROM OpportunityTeamMember WHERE OpportunityId =: OppIdSet Order By OpportunityId];
        system.debug(Logginglevel.INFO,'--oppTeamList------------------>>  ' + oppTeamList ); 
        String keyId = null;
        List<OpportunityTeamMember> oppTeamList2 = new List<OpportunityTeamMember>();
        Map<Id,List<OpportunityTeamMember>> oppTeamMap = new Map<Id,List<OpportunityTeamMember>>();
        
        for ( OpportunityTeamMember oppt : oppTeamList)	{
            if (keyId != oppt.OpportunityId) {
                if (keyId != null) oppTeamMap.put(keyId,oppTeamList2);
                keyId = oppt.OpportunityId;
                oppTeamList2 = new List<OpportunityTeamMember>();
                oppTeamList2.add(oppt);
            } else {
                oppTeamList2.add(oppt);
            }            
        }//end of for
        oppTeamMap.put(keyId,oppTeamList2);
        system.debug(Logginglevel.INFO,'--oppTeamMap------------------>>  ' + oppTeamMap ); 
        
        List<OpportunityTeamMember> InsertOppTeamList = new List<OpportunityTeamMember>();
        for (Opportunity opp : Trigger.new){
            Id oppId = (Id)oppMap.get(opp.Id);
            if (oppId != null) {
                List<OpportunityTeamMember> OppList = (List<OpportunityTeamMember>)oppTeamMap.get(oppId);
                if (OppList != null) {
                    for (OpportunityTeamMember oppt : OppList){
                        OpportunityTeamMember opptN = new OpportunityTeamMember();
                        opptN.OpportunityId = opp.Id;
                        opptN.OpportunityAccessLevel = oppt.OpportunityAccessLevel;
                        opptN.TeamMemberRole = oppt.TeamMemberRole;
                        opptN.UserId = oppt.UserId;
                        InsertOppTeamList.add(opptN);
                    }
                }//end of if
            }
        }//end of for
        system.debug(Logginglevel.INFO,'-- 1 !!------------------>>  ' ); 
        if (InsertOppTeamList.size() > 0 ) insert InsertOppTeamList;
        system.debug(Logginglevel.INFO,'-- 2 !!------------------>>  ' ); 
    }

}
```

# 集めた参考になりそうな記事（でもApexトリガーにしたので使いませんでした）

+ [Automatically create Opportunity Team members based on Account Team using a Record Triggered Flow](https://salesforcedecoder.wordpress.com/2021/02/24/automatically-create-opportunity-team-members/)
+ [Auto Add Opportunity Team Member to Opportunity Follower](https://automationchampion.com/2022/06/07/auto-add-opportunity-team-member-to-opportunity-follower-5/)
+ [Collaborate on Deals by Using Opportunity Teams](https://help.salesforce.com/s/articleView?id=sf.opp_team_manage.htm&type=5)

商談でチームを使うには、設定から有効化しないといけませんでした。