添付ファイル関係　ContentDocument


[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


探すと面倒なので、関連する情報をまとめておきたいと思います。

+ [ファイル、Salesforce CRM Content、Salesforce ナレッジ、ドキュメント、添付ファイルの違い](https://qiita.com/Keiji_otsubo/items/bf28754498127d081159)
+ [Salesforce ContentVersion と添付ファイル](https://qiita.com/Keiji_otsubo/items/bd208168b4274c692efd)
+ [content version - clone from one object to another](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CJ3IL)
+ [What's the best way to find the case record type for contentVersions ...while the ContentVersions are being inserted?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007GHFZX)
+ [ApexTriggerのContentVersion BeforeInsertの中で、A、Bどちらの処理からInsertされたのかを判断する](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007O26Xa)
+ [添付ファイルを別の組織に移行する](https://qiita.com/Keiji_otsubo/items/38716d976b804f890d86)
+ [ファイルアップロード時エラーの判定](https://qiita.com/Keiji_otsubo/items/7d2f9d8c95dc1356a11c)
+ [ファイルのアップロードに伴うセキュリティ担保する方法](https://qiita.com/Keiji_otsubo/items/3f67756d2b34c6d0a5e3)
+ [ファイルのプレビュー](https://qiita.com/Keiji_otsubo/items/a61b2697d78f2c0e02f7)
+ [salesforce 添付ファイルの削除](https://qiita.com/Keiji_otsubo/items/08451961d97c8d15ffb0)
+ [コンテンツファイルのプレビューの問題](https://qiita.com/Keiji_otsubo/items/cc85696b3a3105840305)



# オブジェクトの説明

**ContentVersion**

+ [Expose custom fields on ContentVersion when uploading files](https://ideas.salesforce.com/s/idea/a0B8W00000Gdc4LUAR/expose-custom-fields-on-contentversion-when-uploading-files)

+ [Difference between Content Version and Attachment](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007O2T1HSAV)


ContentDocument は ContentVersion の親であり、最新の ContentVersion のコンテンツを表示します。ContentDocument オブジェクトは、ContentDocument Link オブジェクトを介してファイルをさまざまなレコードに関連付けるために使用されます。

[**CombinedAttachment**](https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_objects_combinedattachment.htm)
[**CombinedAttachment フィールド定義**](https://developer.salesforce.com/docs/atlas.en-us.sfFieldRef.meta/sfFieldRef/salesforce_field_reference_CombinedAttachment.htm)
この読み取り専用オブジェクトには、すべてのメモ、添付ファイル、Googleドキュメント、Salesforce CRMコンテンツのライブラリにアップロードされたドキュメント、およびレコードに関連付けられたChatterに追加されたファイルが含まれます。

[**ContentDocument**](https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_objects_contentdocument.htm)
Salesforce CRM Content のライブラリにアップロードされたドキュメントまたは Salesforce Files を表します。Salesforce CRM Content では、バージョン 17.0 以降でこのオブジェクトを使用できます。Salesforce Files では、API バージョン 21.0 以降でこのオブジェクトを使用できます。
公開できる最大ドキュメント数は 30,000,000 です。アーカイブされたファイルは、この制限とディスク使用量制限に含まれます。
Contact Manager Edition、Group Edition、Professional Edition、Enterprise Edition、Unlimited Edition、および Performance Edition を使用するお客様は、24 時間につき最大ですべての Sandbox 組織を含み 200,000 件の新しいバージョンを公開できます。
Developer Edition とトライアル版のお客様は、24 時間につき最大で 2,500 件の新しいバージョンを公開できます。

[**ContentDocumentLink**](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_contentdocumentlink.htm)

+ ContentDocumentLink に対する条件なしでは、クエリを実行することはできません。
+ ContentDocumentId で条件検索している場合は、ContentDocument 項目で条件検索することはできません。LinkedEntityId で条件検索している場合は、ContentDocument 項目でのみ条件検索を実行できます。
+ 関連オブジェクト項目で条件検索することはできません。たとえば、ファイルのリンク先の取引先のプロパティで条件検索をすることはできません。タイトル項目などのファイルのプロパティでは検索条件できます。
+ SOQL クエリの絞り込みでは、Id、ContentDocumentId、LinkedEntityId のいずれかを条件にする必要があります。
+ ContentDocumentLink オブジェクトでは、挿入、更新、削除操作の前後のトリガがサポートされます。ContentDocumentLink トリガは、ContentDocumentLink に追加や削除があるたびに実行されます。ファイルが削除されると、ContentDocument の削除トリガが実行されますが、カスケードされた ContentDocumentLink の削除では ContentDocumentLink トリガは実行されません。

![image.png](https://developer.salesforce.com/docs/resources/img/ja-jp/238.0?doc_id=images%2FSforce_content_objects.png&folder=object_reference)

![image.png](https://developer.salesforce.com/docs/resources/img/ja-jp/238.0?doc_id=images%2Fsforce_contentnote_object_220.png&folder=object_reference)


+ [Error on deleting a file having a trigger error, any thoughts?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Djhqf)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/db5cf7bd-dc77-8d0b-2562-b72e97b7a460.png)

:::note
client mentioned that they have another package conflicting with CMTD 
:::

# Apexでの操作

+ [ WHERE LinkedEntityId =: IdSetを指定するときにSet変数を使って回避する](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HE7vC)
+ [ClassicおよびLightningでのContentDocumentおよびContentDocumentLinkトリガー動作](https://qiita.com/Keiji_otsubo/items/f7773bbec601a9be60e1)
+ [添付ファイルの名称取得](https://qiita.com/Keiji_otsubo/items/3344ef992a7016a5c5d1)
+ [メモがある取引先責任者を抽出する](https://qiita.com/Keiji_otsubo/items/36860e791166cdd00cc0)
+ [PDFを作成し、Salesforceメールテンプレートに添付する方法](https://qiita.com/Keiji_otsubo/items/63581eade221ec5e1a51)
+ [Sandoboxのテストデータを消す](https://qiita.com/Keiji_otsubo/items/7efdc9535f30f00ce1a5)
+ [Notes と Notes & Attachments にApexトリガーでレコードを作成する](https://qiita.com/Keiji_otsubo/items/3c1b8f76a20bf969a06b)
+ [Experience Cloud サイトユーザーが、アクセスできるレコード上のメモを表示できない](https://help.salesforce.com/s/articleView?id=000380995&type=1)
+ [カスタムオブジェクトの最後に作成された添付ファイルを探すSOQL](https://qiita.com/Keiji_otsubo/items/954877fbbe7703d5ee7f)
+ [商談でアップロードしたファイル（PDF、エクセルなど）を自動的に指定ライブラリに格納する方法](https://qiita.com/Keiji_otsubo/items/64be119e544253d833a4)
+ [ケースにアップロードしたファイル(ContentDocument)の所有者をケースの所有者に変更したい。](https://qiita.com/Keiji_otsubo/items/3fb66005bb8f0cf63bdb)
+ [Apexによる添付ファイル(ContentVersion)更新について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBnDd)

:::note
ContentVersion オブジェクトにUpdate操作をしていますか？ 私自身は今までInsertしかしてこなかったのであんまり深く考えたことはなかったのですが、Updateはできないと思います。

以下の説明にあるように、 ContentVersion オブジェクト をinsertするときに同じ ContentDocumentId をセットすることでバージョン管理ができると思います。

 You can also create a ContentVersion record and have the same ContentDocumentId so that it becomes different versions of same content and the version history will be automatically maintained. 

https://salesforce.stackexchange.com/questions/733/isnt-contentversion-versiondata-updateable-amendable

このような感じでバージョン管理してますね。

```Java
if (cv.ContentDocumentId == null) { 
// ※新規に作成されたContentDocumentがない場合、新たにContentDocumentが作成されるのでContentDocumentLinkを作る。
    String id_val = targetIds.get(i);
    ContentDocumentLink cdl = new ContentDocumentLink(); // ファイルとオブジェクトへのリンク
    cdl.LinkedEntityId = id_val;
    cdl.ShareType = 'V';
    ContentVersion cv2 = cvMap.get(cv.Id);
    Id cdId = cv2.ContentDocumentId;
    cdl.ContentDocumentId = cdId;
    cdlinkList.add(cdl);
}
```

:::

+ [特定のカスタムオブジェクト内の「ファイル」関連リストで以下のような制御](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ahwYV)

:::note
以下の設定がありますが、オブジェクトを選択はできないと思います。すべてのオブジェクトで添付できなくなると思います。

 権限セットを使用して、ユーザが投稿、レコード、および他のオブジェクトに Salesforce ファイルを添付することを防止します。 

ユーザによる Salesforce ファイル添付の防止
https://help.salesforce.com/s/articleView?id=sf.admin_files_sfs_perm.htm&type=5

Apexトリガーを使えばできそうな感じです。

https://salesforce.stackexchange.com/questions/288989/is-there-any-way-to-prevent-upload-a-file-in-notes-attachment-for-a-custom-obj
:::

+ [親に紐づくファイル(添付ファイル)複数、（可能なら親のファイル関連リストごと）、子の関連リストや、自動リンク等で見せる方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aiDIp)


# ContentVersionHistoryオブジェクト

+ [コンテンツドキュメントの閲覧数の正しいカウント方法や注意すべきポイント](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007igB8o)

:::note
ContentVersionHistoryオブジェクトのFieldという項目のcontentVersionViewed — バージョンの詳細が参照されています  を数えて、閲覧数をカウントしているのでしょうか？

 ContentVersionHistoryオブジェクト がSOQLのクエリーでは機能していないようなことが議論されていますね。

https://salesforce.stackexchange.com/questions/335246/how-to-replicate-the-functionality-of-delivered-file-engagement-lwc-card

最終的にはイベントログを使ったみたいですね。有償になったみたいです。

I have actually recently paid for the service to get the full EventLogFile. VersionRenditionDownload is there, yes, but it only displays a file was viewed. Not necessarily which file. I have confirmed with Salesforce support that it is the expected behavior
:::


# Aura コンポーネントの部品

+ [Dynamic Reusable Custom List View In Salesforce Lightning Component](https://sfdcmonkey.com/2019/02/03/dynamic-list-view-salesforce-lightning/)
+ [Create Re-Usable Custom Lookup In Salesforce Lightning Component Version 2 : Dynamic](https://sfdcmonkey.com/2017/07/17/re-usable-custom-lookup/)
+ [Quick Send Email Lightning Component](https://sfdcmonkey.com/2017/01/03/send-email-lightning-component/)
+ [Dynamically Open Salesforce Files or ContentDocument In Lightning Component](https://sfdcmonkey.com/2018/10/29/open-files-lightning-component/)
+ [How To Fetch Multi Picklist Values From sObject To lightning:dualListbox Component](https://sfdcmonkey.com/2018/02/25/fetch-multi-picklist-values-lightningduallistbox-component/)
+ [Custom Data Table With Inline Editing In Salesforce Lightning Component – Sample](https://sfdcmonkey.com/2017/12/08/lightning-data-table-inline-editing/)
+ [Classic環境における、メモ・添付ファイルの内容を配信メールの添付ファイルとして扱う方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000074VP1A)
+ [これがLightning用：Insert files with Data Loader](https://help.salesforce.com/s/articleView?id=000382372&type=1)

# アップロード・ダウンロード関係

+ [データローダーを使用して、添付ファイルをSalesforceにアップロードします。](https://help.salesforce.com/s/articleView?id=sf.loader_attachments.htm&type=5)
+ [メモおよび添付ファイルのインポート](https://help.salesforce.com/s/articleView?id=000321698&type=1)
+ [ApexだけでSalesforceの添付ファイルをZipしてダウンロード](https://www.xgeek.net/ja/salesforce/zip-attachments-only-with-apex-in-salesforce/)
+ [ApexでCSVファイルをアップロードする](https://dackdive.hateblo.jp/entry/2015/03/01/175751)
+ [大量のファイルをエクスポートする方法](https://qiita.com/Keiji_otsubo/items/bd3fee7381a21045f75c)
+ [レコード作成時にファイルをアップロードできるか？](https://qiita.com/Keiji_otsubo/items/cec0a30f8271a05f0cd9)
+ [Opportunity からメモと添付ファイルをダウンロードする方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bKzB9)

# 共有設定

+ [既知の問題:Documentchecklistitem に関連する ContentDocumentLink の Sharetype と Visibility は、デフォルトで「I」と「AllUsers」に設定されます。](https://issues.salesforce.com/issue/a028c00000j5kDhAAI/sharetype-and-visibility-of-contentdocumentlink-related-to-documentchecklistitem-are-being-defaulted-to-i-and-allusers)
+ [レコードで共有されるファイルのデフォルトでの表示設定値](https://help.salesforce.com/s/articleView?id=000384243&type=1)
+ [ファイルで公開リンクがでるものでとないものがある。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IR8Fy)
+ [内部ユーザにファイルを公開したいです。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000NGYHn)

:::note
Lightningではオプションがないと書かれていますね。
全ての内部ユーザを含んだ公開グループを作って、そのグループをセットするのが早いかもしれません。

To extend or set file access to the company:
1. Share the file with a Public Group that has all internal users in it
2. Share the file via the All Company Feed on Chatter tab
3. Extend Access to "Any user in your company" via Classic

[File sharing setting for 'Any User in your company' is not available in Lightning](https://help.salesforce.com/s/articleView?id=000383711&type=1)
:::

+ [レコード添付ファイルの自動共有](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgJDXSA3)


:::note
Apex トリガーで実装する例が紹介されています。

To customize file sharing behavior, define an Apex trigger for the ContentDistribution or ContentDocumentLink objects. The ContentDistribution object represents a file shared externally. A ContentDocumentLink represents a file shared with an internal object, such as a user, group, or record.

The ContentDocumentLink object supports triggers before and after these operations: insert, update, delete.

https://salesforce.stackexchange.com/questions/127195/how-to-share-the-uploaded-salesforce-file-automatically
:::

+ [エクスペリエンスサイトでアップロードされたファイルは公開グループに共有](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Peklk)
+ [INVALID_FIELD_FOR_INSERT_UPDATE, Visibility InternalUsers is not permitted for this linked record](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Vie8L)

# 画面関係

+ [ファイルオブジェクトにカスタムボタンを配置する方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PghoL)

# 関連資料

+ [How to Convert Attachments to Files in 9 Easy Steps!](https://www.eternussolutions.com/2017/11/14/convert-attachments-files-9-easy-steps/)
+ [Transitioning from Notes and Attachments to Files in Salesforce](https://blogs.perficient.com/2018/11/02/transitioning-from-notes-and-attachments-to-files-in-salesforce/)

# This List is not customizable

+ [How to Add Notes and Attachments related list, after creating an Object_not customizable error message](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZAICk)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/398f36bf-07a9-2392-bb32-4c688cd98d34.png)


:::note
Please check this article. 

https://help.salesforce.com/s/articleView?id=000385730&type=1

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8V4tSAF
:::

# できないこと

+ [ファイル共有リンクのダウンロードボタンを非表示にしたい。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajaLA)

:::note
以下の答えは「それはできません」です。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A90S2SAJ

アイデアや回避策が提案されていますが、場合によっては機能しないようです。

https://ideas.salesforce.com/s/idea/a0B8W00000GdgbGUAR/make-some-content-preview-only-no-download
:::



# 文字化け

+ [文字化け](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NRFSI)

:::note
同じ問題がありましたが、唯一の解決策は、最新の DataLoader を使用して、「UTF-8 エンコードのすべての CSV を読み込む」設定を有効にしてファイルをインポートすることです。Workbench または Salesforce Inspector を使用してアップロードしようとすると、元の投稿で言及した奇妙なフォーマットになります。
:::