こんにちはアンダーソンです。
今回はスケジュールトリガフローを使って、
レコードの更新をしていきたいと思います。
何をしたいか
条件に合致するレコードを複数取得して特定の更新をしちゃうものを作ります。
言葉だとわかりにくいので下記のようなイメージを用意しました。

まあ、内容はどうでもいいんですが、今回の要点は
・複数レコードを明示的に並び替えましょう。
・親のレコードを何度も更新する事が無いようにしましょう。
・今回取得したレコードには全件更新をかけましょう(コピー済)
この辺をやっていく感じです。
では作っていきましょう!
フローの作成
今回はスケジュールトリガフローを選びます。

スケジュールトリガはその名の通りスケジュールされたフローです。
いつを設定できる便利なやつです。開始時刻は1分単位で決める事ができるのと、
頻度は一回、毎日、毎週から選択できます。

次に動かす対象のレコードを指定します。
先程の条件に合わせて取得するレコードを決めるんですが、スタート時のレコード指定は一応省略も可能なんですよね。
今回の要件の場合、親の取引先を更新するので、
1トランザクション内で同じレコードを何度も更新する可能性があるのでここでは指定せずに単純にレコードを取得から全件取得してコレクション変数に格納するやり方にしたいと思います。
ちなみに最初に取得した値は『$Record』変数に入るので覚えておくといいと思います。
対象のレコードを取得する
ではいつものようにレコードを取得からレコードをとっていきましょう。

レコードを取得の際に、今回はレコードを並び変えて出します。
上記の場合、コンタクト年月日を降順に指定しているので、古い順に出てきます。
これで、最初に出てくるレコードの値を更新すべきとなりました。
ただ今のままだとこんな状態です。
Contact1 Account1 2020/12/10
Contact2 Account2 2020/12/09
Contact3 Account1 2020/12/08
Contact4 Account2 2020/12/07
こんな感じで出てくるので、この後素直にループしてAccountを更新してしまうと
一番古い日付で更新されてしまいますね。
ですのですでに更新されたかどうかを取得するロジックが必要になります。
すでに登録したかを判定する
では先ほど取得したレコードコレクションを元にループを回していきますが、
最終的な形はこんな感じになります。

コピー済みの取引先かどうかを判定し、すでにコピーされていれば、取引先責任者のコピー済みをTrueに更新、なければ取引先にコンタクト年月日を登録し、コピー済みもTrueにするって感じです。
そのために下記のようなコレクション変数を準備しました。
テキスト型のIdのリストです。ここには登録したAccountIdが入る想定です。

で、決定ではこのIdListに現在のループのAccountIdが含まれているかを確認します。

その中にあるかどうかは次の文字列を含むを使います。
この場合、文字列を含んでいれば登録済み、含んでいなければ登録なしとなります。
登録がない場合はこんな感じで取引先責任者のコピー済みだけを更新します。
この後更新用のコレクション変数に入れておきます。

次に登録がなかった場合です。
登録がなければそのAccountIdを持つContactのコンタクト年月日をAccountにコピーしたいので、下記のようになります。

取引先の最終コンタクトにはループ現在の年月日を登録し、コンタクトのコピー済みもTrueに変更します。そしてのちの判定で使うのでIdListにもAccountIdを追加しておきます。
もちろんこの後更新用のコレクション変数に格納します。
最終的なフローはこんな感じです。

動きの確認
今回は実験もしてみました。
こんな感じで対象のレコードを数十件用意しました。


この中だとAccount1の日付は2020/12/10になるはずですね。
そして最終全部にコピー済みが着くはず。

時間を決めて。。。有効化します。時間になったら確認です。

OKですね!更新者もProcessAutomatedになっています。時間もきっちり。
ちなみに取引先責任者の方はどうでしょう。

こちらも想定通りですね。
まとめ
今回はスケジュールフローから中のちょっとした動きの工夫の部分を書いてみました。
ぜひ応用していろんな方法に試していただければと思います。
何か間違ってることやこうすればいいのになどあればTwitter等で教えてください!