前回「Salesforceフロー変数の基礎と使い分けを分かりやすく解説!」という記事で、Salesforceフローの変数について説明をしました。

フローを作成する上で変数は大事ですが、これだけではフローを作成することは出来ません。
そのため、今回はフローを作成する上で大事なロジックとなる「決定」と「ループ」について説明します。
Salesforceフローだけではないプログラムの基本的な考え方から、実際にどのようにロジック要素を使用していくかを解説します。
プログラムの基本的な考え方
本セクションでは、プログラムの基本的な考え方を説明します。
「決定」と「ループ」を早く知りたいという方は、本セクションをスキップしてください。
プログラムの基本構造
どんなに複雑なプログラムでも、3つの要素「順次実行」「条件分岐」「繰り返し」が組み合わさって成り立っています。
これらが組み合わさることで、世の中のプログラムは動いています。
それはSalesforce自体もSalesforceの中で作るフローも変わりません。
1つ目:順次実行
Salesforceフローを含め、プログラムは上から順番に処理をしていく「順次実行」を行います。
今読んでいる日本語の文章を左から右へ読み進めていくように、プログラムが処理を行うときは、上から下に向かって処理を進めます。

上図のようにフローやプログラムを作成したら、上から順番に「処理Ⓐ → 処理Ⓑ → 処理Ⓒ → 処理Ⓓ」と実行をしていきます。
当たり前のように感じるかもしれませんが、論理的にフローを実装する上で大事な考え方です。
2つ目:条件分岐
日常生活で状況や要望に応じて自身の行動が変わることは、よくあると思います。
例えばあなたがハンバーガー屋の店員さんだとします。
あなた(店員)がお客様に提供するべき商品は、お客様の注文内容によって変化します。
セットが注文された時はハンバーガーとポテトと飲み物を提供し、単品の場合はハンバーガーだけ提供します。
ポテトだけが追加されたときは、ハンバーガーに加えてポテトも提供しますが、ドリンクは提供しません。
このように内容に応じて、実行するべきアクションが変わることは、プログラムでも同じです。
先程の例をシステムとして考えた時には、以下のように処理が分かれます。

上図のようにユーザからの入力値や取得したデータなど、内容に応じて処理を分けることを「条件分岐」と言います。
3つ目:繰り返し
決まった回数や条件を満たすまで同じアクションを何度も実行することを「繰り返し」と言います。
例えば、あなたが自動販売機で180円の飲み物を買おうとした時、どのような行動をしますか?
(キャッシュレス決済が可能な世の中ではありますが)180円を超えるまでお金を投入すると思います。
この「~されるまで~する」という部分が、繰り返しにあたります。
自動販売機の例を図にしてみましょう。

上図の中ではピンク色になっている「お金を投入する」という部分が、繰り返しにあたります。
「180円以上」という内容は、繰り返しの終了条件となっています。
次のセクションから「条件分岐」に該当する 決定 と「繰り返し」に該当する ループ について説明します。
【決定】を使って条件を分岐させよう
Salesforceのフローでは、データの値に応じて処理を分けることが出来る要素「決定」というのがあります。
この要素を使うことで、例えば「20歳以上なら飲酒が出来る、20歳未満なら飲酒は出来ない」という条件分岐が出来るようになります。
要素「決定」の使い方
フローの作成画面で「+」ボタンを押し、要素の選択から「決定」を選びます。

表示ラベルやAPI参照名を入力したら、分岐させるための条件を設定します。
要素自体の表示ラベルやAPI参照名だけでなく、条件自体にも表示ラベルとAPI参照名を記載する必要があります。

条件を設定することで、フローのメイン画面に2つの線が表示され、処理を分岐出来ることが確認できます。

20歳以上の人に対してだけ行う処理があればⒶの「+」ボタンをクリックして要素を追加してください。
反対に、20歳未満の人に対してだけ行う処理があればⒷの「+」ボタンをクリックし要素を追加します。
年齢確認によって個別に行う処理が終われば、後続処理としてⒸの「+」ボタンをクリックして、要素を追加します。
Memo:デフォルトの結果にも適切な条件名をつけること
- 先程の例では20歳未満の分岐側は、なにも設定せず「デフォルトの結果」のままでした
- しかし今後のメンテナンス性を考慮すると、しっかりと条件名を付けてあげる必要があります
- 「20歳未満」と明記することで、パッと見た時に、どのような分岐なのかイメージしやすくなります。

【ループ】 っていつ使って、どういう風に使うの?
ループとは、複数のデータ(レコード)に対して、まったく同じ処理を順番に繰り返してくれる機能のことです。
例えば「完了予定日が過ぎた全ての商談に対して、今月末の日付を入力する」といった一括処理が得意です。
一件ずつ手作業で行っていた面倒な更新作業を、フローがあなたに代わって一瞬で完了させてくれます。
ループの使い方
前回の記事でコレクション変数について説明を行いました。
ループを使いこなすには、この「コレクション変数」が欠かせません。
コレクション変数を使ったループ要素の配置
フローの作成画面で「+」ボタンを押し、要素の選択から「ループ」を選びます。
表示ラベルとAPI参照名を記載し、コレクション変数を選べば、ループ要素の配置は完了です。

その後、ループ内の「+」ボタンをクリックし要素を追加します。
これによりコレクション変数の各データに対して、ループ内に追加された全てのアクションが実行されます。

今回の例「完了予定日が過ぎた全ての商談に対して、今月末の日付を入力する」では、まずは割り当て要素を追加します。
表示ラベルとAPI参照名を記載したら、変数で「ループ 商談の完了予定日変更 の現在の項目」を選びます。

クリックすると商談の項目名が表示されるため、「完了予定日」を選択します。
演算子を「次の文字列と一致する」にし、値の新規リソースにて「数式」を選択します。
以下の内容を入力し、今月末の日付を計算するリソースを作成します。
API参照名:thisMonthDate
データ型:日付
数式:ADDMONTHS(DATE(YEAR({!$Flow.CurrentDate}), MONTH({!$Flow.CurrentDate}), 1), 1) - 1

以下の画像のようになると、今回の例「完了予定日が過ぎた全ての商談に対して、今月末の日付を入力する」が実現できます。

注意点:ループ内でレコード操作はNG
先程ループを活用し、商談の完了予定日に今月末を入力することが出来ました。
さっそく要素「レコードを更新」を使って、完了予定日を更新しようとしたくなりますが、ちょっと待ってください。
このままループ内に「レコードを更新」を置いてしまうと、とんでもない処理がかかってしまいます。
ループ処理についておさらいすると、「ループ内に配置された要素が、終了条件を満たすまで繰り返される」です。
ループ内に「レコードを更新」を置くと、もちろん商談レコードは更新されます。
しかし、例えば商談レコードが10,000件あった場合、10,000回レコードの更新処理が動いてしまいます。
これではSalesforceが設けているシステム上の負荷制限(ガバナ制限という)に抵触してしまう可能性が、非常に高いです。ガバナ制限に抵触しなくとも、都度レコード更新が動いてしまうのは、動作が遅くなる原因になります。
これらを回避するために、「レコードを更新」や「レコードを取得」などのレコードを操作する系の要素は、ループ内に配置しないようにしましょう。

まとめ:【決定】で条件分岐し、【ループ】で処理を繰り返す
今回はプログラムの基本構造からフローの「決定」と「繰り返し」について紹介しました。
フローを構築していく中で、プログラムの基本に立ち返りたくなりましたら、本記事を振り返っていただければ幸いです。
今回のポイントを以下にまとめておきます。
- プログラムは「順次実行」「条件分岐」「繰り返し」の3つの要素で成り立っている
- 「条件分岐」はSalesforceフローの「決定」が該当する
- 「繰り返し」はSalesforceフローの「ループ」が該当する
- ループを使うためには、コレクション変数が必要不可欠
- ループ内にレコードを操作する要素を置くとガバナ制限に抵触するため、コレクション変数を活用してループ外で処理をさせる
Salesforceフロー自体は難しくありません。
物事を分解し、一つ一つ論理的に考え、プログラムの基本構造を意識することが、ロジカルな開発へと繋がります。
まずは今回のような簡単な例から、開発を始めてみてはいかがでしょうか。

