商談に紐づくカスタムオブジェクトのメモを商談のメモに複数転記する



+ [商談に紐づくカスタムオブジェクトのメモを商談のメモに複数転記したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eozHt)

:::note
実際にはメモと読み表レコードを紐付けるオブジェクト(ContentDocumentLink)があるので、以下はもう少し複雑です。

読み表レコードにメモが追加、更新、削除された時に商談側のメモを更新することと思いますので、

トリガー：「メモ」の更新
↓
メモを追加した読み表レコードの取得(ここで商談Idを取得します)
↓
上記商談Idを使って同じ商談を参照している読み表レコードの取得
↓
ここでループさせて、Idのコレクション変数に読み表レコードのIdを追加します。
↓
このコレクション変数を使ってメモを取得します。
↓
取得したメモでテキストテンプレートにメモ内容を追加します。
↓
最終的に上記商談Idとテキストテンプレートを使って商談を更新します。
:::

深く考えずにコードにしてみたのですが、かなり複雑ですね。
複数のメモがあった場合がもっと面倒だな。

```Java
trigger UpdateNote on ContentVersion (after insert, after update) {
	//after delete, after undelete
    if (Trigger.isAfter) {
        Set<Id> cvIdSet = new Set<Id>(); 
        for(ContentVersion cv : Trigger.new) {
            if (cv.FileType == 'SNOTE') {
                cvIdSet.add(cv.ContentDocumentId);
            }
        }//end of for    
        Set<Id> yomihyouIdSet = new Set<Id>(); 
        List<ContentDocumentLink> cdlList = [SELECT Id,LinkedEntityId FROM ContentDocumentLink WHERE ContentDocumentId =: cvIdSet];
        for(ContentDocumentLink cdl :  cdlList){
            String st = cdl.LinkedEntityId;
            if (st.left(3) =='a1m'){
                //読み表のオブジェクのIdの前から３桁
                yomihyouIdSet.add(st);
            }
        }//end of for   
        List<yomihyou__c> yomihyouList = [SELECT Id,Opportunity__c FROM yomihyou__c WHERE Id =: yomihyouIdSet ];
        Set<Id> oppIdSet = new Set<Id>(); 
        for (yomihyou__c yomi : yomihyouList){
            if (yomi.Opportunity__c != null){
                oppIdSet.add(yomi.Opportunity__c);
            }
        }//end of for  
        if (oppIdSet.size() > 0) {
            List<yomihyou__c> yomihyouList2 = [SELECT Id,Opportunity__c FROM yomihyou__c WHERE Opportunity__c=: oppIdSet order by Opportunity__c];
            system.debug('--- yomihyouList2 ---' + yomihyouList2);
            Map<Id,Id> yomihyouToOpportunityMap = new Map<Id,Id>();
            Set<Id> yomihyouIdSet2 = new Set<Id>(); 
            for (yomihyou__c yomi2 : yomihyouList){
                yomihyouToOpportunityMap.put(yomi2.Id,yomi2.Opportunity__c);
                yomihyouIdSet2.add(yomi2.Id); 
            }//end of for   
            system.debug('--- start ---' + yomihyouIdSet2);
            List<ContentDocumentLink> cdlList2 = [SELECT Id,ContentDocumentId,LinkedEntityId FROM ContentDocumentLink WHERE LinkedEntityId =: yomihyouIdSet2];
            Map<Id,Id> yomihyouToContentDocumentMap = new Map<Id,Id>();
            Set<Id> cdlIdSet2 = new Set<Id>(); 
            for(ContentDocumentLink cdl2 :  cdlList2){
                yomihyouToContentDocumentMap.put(cdl2.LinkedEntityId,cdl2.ContentDocumentId);
                cdlIdSet2.add(cdl2.ContentDocumentId);
            }//end of for

            List<ContentVersion> cvList2 = [SELECT Id,VersionData,TextPreview,ContentDocumentId FROM ContentVersion WHERE FileType = 'SNOTE' AND ContentDocumentId =: cdlIdSet2];
            Map<Id,Id> ContentDocumentIdToTextPreviewMap = new Map<Id,String>();
            for (ContentVersion cv2 : cvList2){
                ContentDocumentIdToTextPreviewMap.put(cv2.ContentDocumentId,cv2.TextPreview);
            }
            //商談にメモがあるかを確認する
            List<ContentDocumentLink> cdlList3 = [SELECT Id,ContentDocumentId,LinkedEntityId FROM ContentDocumentLink WHERE LinkedEntityId =: oppIdSet];
            Map<Id,Id> oppToContentDocumentMap = new Map<Id,Id>();
            Set<Id> cdlIdSet3 = new Set<Id>();
            for(ContentDocumentLink cdl3 :  cdlList3){
                oppToContentDocumentMap.put(cdl3.LinkedEntityId,cdl3.ContentDocumentId);
                cdlIdSet3.add(cdl3.ContentDocumentId);
            }
            List<ContentVersion> cvList3 = [SELECT Id,VersionData,TextPreview,ContentDocumentId FROM ContentVersion WHERE FileType = 'SNOTE' AND ContentDocumentId =: cdlIdSet3];
            for (ContentVersion cv3 : cvList3){
            }
            LIST<Opportunity> oppList4 = [SELECT Id FROM Opportunity WHERE ID =: oppIdSet ];
            for (Opportunity op4 : oppList4){
            }
        }
    }//end of if
}
```