Salesforceフローで各レコードの添付ファイルの有無を自動チェックする

# この記事の概要
セールスフォースでレコードに添付ファイルがついているかどうかがリストビューから分かるといいな、と思った事ありますよね？
やり方を探してみると、APEXでの開発が必要という記述が見つかります。

しかし、コードなんて書けない！！
という人（僕のことです）の為に、
フローで何とかできないか、やってみました。

残念ながらファイルの添付をトリガにしたレコードトリガフローは作れないようなので、
毎晩実行されるスケジュールトリガフローで
添付した翌日にはチェックボックスがtrueになるというものを作りました。

なんか簡単なようで結構大作になってしまったので、
もしかしたらもっとシンプルな方法があるかもしれません。

また僕はこれの応用で
SVFcloudで帳票ファイルに添付画像を出力するために必要なコンテンツドキュメントIDを
自動でテキスト項目に記入するフローを使っています。
途中でレコードを取得しているのでこれも殆ど同じように作れます。

# 添付ファイルのリレーションってどうなってるのか
セールスフォースの添付ファイルは下の図のようなオブジェクトで構成されています。
![添付ファイルの構造.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/f18584e6-05c6-8466-c2b6-85f17c030dc0.jpeg)
添付されるオブジェクトに直接添付ファイルオブジェクトのリレーションがあるわけではなく、
間にコンテンツドキュメントリンクという連結オブジェクトを持つ、いわゆる多対多のリレーションになっています。

厄介なのはコンテンツドキュメントリンクには作成日の項目が無い事です。
なので、今回のフローでは
前日に作成されたコンテンツドキュメントのレコードを取得して、
そこからコンテンツドキュメントリンクのレコードを辿って、
添付されるオブジェクトのレコードを見つけて「添付ファイルの有無」チェックボックスをtrueにします。

# フローの全体像
![スクリーンショット 2022-05-06 110934.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/e077dd19-33bb-d7b6-dcc6-4b15c9bd1381.png)
![スクリーンショット 2022-05-06 110958.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/317defd9-2948-3226-4219-0840da5ab072.png)
![スクリーンショット 2022-05-06 111015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/de0f9a71-d74c-9d56-36a2-0f87d05b74f7.png)
![スクリーンショット 2022-05-06 111029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/0cee3022-8c4b-a8f5-ddee-e1c03ae0d698.png)
全体像はこんな感じです。
流れは、
1. 前日に作成されたコンテンツドキュメントのレコードを取得
1. 取得したコンテンツドキュメントレコードの子レコードであるコンテンツドキュメントリンクをコレクション変数に割り当て
1. リンク先の添付元レコードを取得
1. 1レコードに複数ファイルが添付されている場合に重複しないようにしながら、添付元レコードをコレクション変数に割り当て（この時に添付ファイルチェックボックス項目をtrueにする）
1. コレクション変数に基づいて添付元レコードを更新

と、なります。
割とめんどくさいのが複数ファイル添付のチェックです。
しかしこれをやっておかないとレコード更新時にエラーが出ます。
おかげで多重ループも使う羽目に。

あと、細かい説明を省いていますが適宜必要な変数を作成してください。

# 中身
## 前日に作成されたコンテンツドキュメントのレコードを取得

![スクリーンショット 2022-05-06 112106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/e5dc5d5c-c043-8ba4-08cc-ed69cfa7bf72.png)
とりあえず、毎晩動くようにしておきます。
![スクリーンショット 2022-05-06 112151.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/7e3636ec-024a-08fc-bfce-afa7319b31f5.png)
コンテンツドキュメントオブジェクトで前日以降に作られたレコードをすべて取得します。（前日は数式で作っておきます）
## 取得したコンテンツドキュメントレコードの子レコードであるコンテンツドキュメントリンクをコレクション変数に割り当て
![スクリーンショット 2022-05-06 112345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/b02d3f08-3d69-ad8f-ceed-d29418cd76a8.png)
取得したレコードでループします。
![スクリーンショット 2022-05-06 112456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/3dd1e1a2-1606-baa0-bfef-2ca7dd86230b.png)
コンテンツドキュメントリンクオブジェクトのレコードを取得します。
条件はこのレコードの親になるコンテンツドキュメントIDがループしているレコードのIDと一致しているものです。
![スクリーンショット 2022-05-06 112706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/3dc9a91a-5488-2cb3-9fab-376329228fa8.png)
取得したレコードをコレクション変数に割り当てます。

このループを回して、コンテンツドキュメントリンクのコレクション変数を前日作成されたもので満たします。
## リンク先の添付元レコードを取得
![スクリーンショット 2022-05-06 112835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/879e5e75-3626-9e15-6279-8a0201a2eb1c.png)
作成したコンテンツドキュメントリンクのコレクション変数でループします。
![スクリーンショット 2022-05-06 112948.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/ac532492-2493-9197-c13f-e0edca71cd50.png)
添付されるオブジェクトのレコードを取得します。
条件はカスタムオブジェクトIDがループしているレコードの「リンク済みエンティティID」と一致するものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/2694a6c3-5594-b08b-b872-1dae61bd24ec.png)
レコードが取得できたかどうかを確認します。
（今思ったけどもしかしたらこれ要らないかも。）
## 1レコードに複数ファイルが添付されている場合に重複しないようにしながら、添付元レコードをコレクション変数に割り当て（この時に添付ファイルチェックボックス項目をtrueにする）
![スクリーンショット 2022-05-06 113457.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/280f13b3-4a19-3b5e-56f4-b95d9934e72c.png)
コレクション変数でループします。このコレクション変数は最終的に更新する対象となる添付されるオブジェクトのレコードコレクションです。
![スクリーンショット 2022-05-06 113643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/4aa25109-3c39-1905-c945-de8c2b71d865.png)
さっき取得した添付されているレコードがループしているレコードとIDが一致するかどうかを確認します。
![スクリーンショット 2022-05-06 113818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/6b1275c7-0b74-00c3-c2d1-99dd584f4770.png)
上記の分岐で重複するとされた場合にBoolean変数をTrueにします。この変数は予め別途作成しておいてください。
このループで、総当たりで重複するレコードがないか確認をしていき、一つでも重複があればBoolean変数で記録するようになっています。
![スクリーンショット 2022-05-06 114100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/5b523d22-6739-9c65-bb50-77d29291bd72.png)
で、Boolean変数がTrueかどうかで重複がある（つまり同一レコードに添付されている二つ目以降の添付ファイル）事を確認します。
![スクリーンショット 2022-05-06 114242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/7dee6220-87ae-0384-20b5-df512b5d28d2.png)
重複が無い場合は単一レコード変数に割り当てます。この時に添付ファイルの有無項目のチェックボックスをtrueにしておきます。
![スクリーンショット 2022-05-06 114418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/a1088871-731c-4692-7085-6405e9a9ddcf.png)
で、単一レコード変数をコレクション変数に追加します。
![スクリーンショット 2022-05-06 114521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/ef17cf93-5951-c1ac-6386-7b3cf85e2688.png)
また重複確認に使用するのでBoolean変数をFalseに戻しておきます。
## コレクション変数に基づいて添付元レコードを更新
![スクリーンショット 2022-05-06 114640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/d71fb887-59f7-987b-947d-1c9c8c19bc7e.png)
最終的に更新すべきレコードコレクション変数が空っぽでないかどうか、つまり前日に何も添付されなかったかどうかを確認します。
これをやらないと空でレコード更新するとエラーが出ます。
月曜日に出勤してきたらエラーのメールが来てると凹みますよね。
![スクリーンショット 2022-05-06 114848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629350/cefeffd5-0add-770c-fcbc-30b9379544c4.png)
最後にコレクション変数を基にレコード更新して終わりです。

# 最後に
もっとクールな方法があるような気もしますが、
今の僕にできるのはこんな感じです。
特に、ループの中でレコードを取得しないで済む方法があればいいなと思ってるんですが、
どうしたらいいんでしょうね。