はじめに
(Mac環境の記事ですが、Windows環境も同じ手順になります。環境依存の部分は読み替えてお試しください。)
この記事を最後まで読むと、次のことができるようになります。
- Salesforceの添付ファイルについて理解する
- Apexを使って実装する
目的
関連リストに紐づく添付ファイルは、親レコードと参照関係となるため、親レコードの状態に関係なく操作(作成/編集/削除)ができてしまう。例えば、承認プロセスのレコードロック状態においても添付ファイルの更新が可能。ある条件
を満たした場合は、添付ファイルの操作を制限したい(入力規則のようなイメージ)。
(後にSalesforce ClassicとLightning Experienceで添付ファイルの保存先が異なることを知り、無理やりLightning Experienceでも動くようにしました。そのためコードは美しくありません。)
アプリの仕様
条件を満たした場合は、添付ファイルの操作(作成/編集/削除)を制限します。
項目名 | 説明 |
---|---|
AVR No. | レコードの連番 |
IsActive | アクティブ設定 |
Memo | メモ |
SObject | 添付ファイルを制限するSObject名 |
SOQL WHERE Clause | 添付ファイルを制限する条件 |
Excluded Profile | 制限を対象外にするプロファイル名 |
Excluded Public Group | 制限を対象外にする公開グループ名 |
Excluded User | 制限を対象外にするユーザ名 |
Error Message | エラーメッセージ |
イメージ画像
設定画面 |
---|
![]() |
制限画面 |
---|
![]() |
関連する記事
実行環境
環境 | Ver. |
---|---|
macOS Mojave | 10.14.3 |
Salesforce | Winter '18 |
ソースコード
実際に実装内容やソースコードを追いながら読むとより理解が深まるかと思います。是非ご活用ください。
ポイント
-
Salesforce ClassicとLightning Experienceでは、添付ファイルの保存先が異なる。Salesforce Classicは
Attachment
、Lightning ExperienceはContentDocument
に保存される。 -
ContentDocument
は親レコードの参照項目をもっていないため、ContentDocumentLink
から参照する。 -
ContentDocumentLink
はContentDocument
の後に作成される。 -
ContentDocument
(Insert)のエラーメッセージ設定は、FinalException
が発生するため、InsertはContentDocumentLink
のTriggerイベントで判断し、Update/DeleteはContentDocument
のTriggerイベントで判断する。 -
(参考) 親レコードの
CombinedAttachments
を参照するとAttachment
とContentDocument
の両方がとれる。SELECT Id, Name, (SELECT Id, Title FROM CombinedAttachments) FROM Opportunity
-
(参考)
Attachment
とContentDocument
は種別で見分けができる。添付ファイルはAttachment
、ファイルはContentDocument
となる。
動作検証
添付ファイルを制限する条件を設定する(商談のフェーズがClosed Won
の場合は、添付ファイルの操作を制限する)。

レコードを作成および添付ファイルを設定して条件を満たす状態にする(フェーズをClosed Won
に設定する)。

添付ファイルを削除する
