セーブポイントが見つからない

【Salesforce】フローによる添付ファイルの複製方法!

こんにちは、にいるです。

「Salesforceファイルを特定のレコードに紐づけたい」という機能をフローで作ってみました。

せっかくなので、そのプログラムを記事にしておきたいと思います。

1.リレーション

要件としては、「ボタンを押すと添付ファイルがレコードに作成される」というものでした。
考えついた行き先は、「Salesforceファイルにリンクを張る」という結果になりました。

オブジェクトのリレーションは3つのオブジェクトが関連しています。
最初は、この辺が理解できていなかったので、Attachmentの作成に失敗していました。

リレーションとしては、
コンテンツドキュメント(ContentDocument)とコンテンツドキュメントリンク(ContentDocumentLink)が紐づき、コンテンツドキュメントリンクが紐づけたいレコードと紐づく内容になります。

コンテンツドキュメントリンクがトランザクションデータとして、2つのオブジェクト間を繋いでいます。

なので、Attachmentはどこにも出てきませんでした笑

手順はフローとカスタムボタンの作成、ページレイアウトにボタン設置の3つだけです。

2.添付ファイルをコピーするフロー

作成したフローです。

コンポーネント3つと変数1つの設定だけで実現できます。

まずは紐づけるドキュメントを取得します。
ここは直にIDを指定して、レコードを取得していますが、データスキュー回避のためにロジックを1つ入れるのもアリだと思います。

次に紐づけ先のレコードを取得します。
今回はカスタムオブジェクトの「主」を取得しています。

ここでカスタムボタンからレコードIDを渡すための変数を作成しておきます。
※詳細はセクション3に記載します。

そして最後に両者を結びつけるためのコンテンツドキュメントリンクの作成ですね。

これで有効化すれば完了です。

3.フローを呼び出すカスタムボタンの作成

カスタムボタンの作成は、このボタンを呼び出したいオブジェクトで行います。
[設定]→[オブジェクト]→[設定したいオブジェクト](今回は主オブジェクトを指定します。)

肝は「/flow/CopyAttachment?recordId={!Master__c.Id}&retURL={!Master__c.Id}」です。

ここでページに埋め込まれているレコードIDを取得してフロー変数へ渡しています。
最後のretURL=はフロー終了後に、このレコードに遷移する機能を付与しています。

■フロー変数の定義

フロー変数の定義について、フローへ渡すレコードIDは下記の仕様でないとフローへ渡せません。

recordIdという名前に設定しないといけません!
これはSalesforceの仕様なので、ここもしっかりと確認しておきましょう。

4.ページレイアウトでカスタムボタンを設置

作成したカスタムボタンをページレイアウトで表示します。

これで使用できるようになりました。

■カスタムボタン押下前

■カスタムボタン押下後

問題なく、Attachmentにドキュメントが紐づいているので想定通りです。

5.注意点

5-1.フローの古いバージョンの無効化

別環境に移行してリリース検証しているとなぜかrecordIdがnullのままで、Attachmentが作成されませんでした。

原因は古いバージョンが有効化されていたので、ページに設置してあるボタンが古い方を呼び出していたのかなと。

ボタン押下してもうまくいかないときは、別のバージョンを呼び出している可能性があるので古いものは無効化しておきましょう!

5-2.データスキュー問題

また、1つのコンテンツに子レコードを大量に増やしていくので、上限値は決めておいた方がいいです。

10,000件以下にしておけばデータスキューも起きないので。

※データスキューについてはこちらの記事にしています。

5-3.Attachmentのトリガは無関係

このフローはAttachmentではなく、「コンテンツドキュメントリンク」を作成する仕様になります。
これは組織にすでに保存されているファイルに紐づける方法です。

そのため、このボタンを押下してもAttachmentのApexトリガは実行されないので、注意ください。

6.まとめ

いかがでしたでしょうか。

メモ & 添付ファイルを作成する目的なので、Attchment作成に囚われていました。

ですが、仕様確認のためにオブジェクトのリファレンスを読んでいくと、あれ?既存ファイルならコンテンツを使えばいいのか、というところで納得することができました。

データスキュー問題があるので、もう1つ処理を付け足すことをおすすめしますが、子レコードが大量にできないのであればこのプログラムのままでもいいと思います。

皆さんもぜひ色々と試してみてください。
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。

ではでは!