ループを作成する
学習の目的
この単元を完了すると、次のことができるようになります。
- フローでループ要素を作成する。
- フローループの外側にデータ要素を配置して、フローエラーを回避する。
ループでアクションを使用する
Flow Builder でループを作成します。前の単元で Pyroclastic Inc. が使用していたフローを作成しましょう。このフローは毎日実行され、クローズから 7 日が経過したすべての商談レコードを特定し、それらの商談レコードをロックして、商談の Chatter フィードに投稿します。
スケジュールフローを作成して商談を取得する
まず、毎日実行されるスケジュールフローを作成します。次に、[Get Records (レコードを取得)] 要素を使用して、[Close Date (完了予定日)] が 7 日以上前のすべての商談を取得します。多くの場合、フローの開始要素で商談を取得できますが、7 日前の日付を判定するには数式が必要です。開始要素は数式をサポートしていないため、[Get Records (レコードを取得)] 要素を使用します。
- スケジュールトリガーフローを作成します。
- [Set a Schedule (スケジュールを設定)] パネルで、[Start Date (開始日)] で今日の日付を選択します。
- [Start Time (開始時刻)] で [12:00 AM (午前 12 時 00 分)] (または [00:00]) を選択します。
- Frequency (頻度): [Daily (毎日)] を選択します。
- キャンバスで
をクリックします。
-
[Get Records (レコードを取得)] を選択します。
- [Label (表示ラベル)] に「
Get Opps Closed 7 Days Ago(7 日前にクローズされた商談を取得)」と入力します。
[API Name (API 参照名)] にはGet_Opps_Closed_7_Days_Agoと自動入力されます。
- [オブジェクト] で [商談] を選択します。
- [Condition Requirements (条件の要件)] で [All Conditions Are Met (AND) (すべての条件に一致 (AND))] を選択します。
- [Field (項目)] で [Close Date (完了予定日)] を選択します。
- [Operator (演算子)] に [Less Than or Equal (<=)] を選択します。
- [Value (値)] で [New Resource (新規リソース)] をクリックして、新しい数式を作成します。
- [リソース種別] で [数式] を選択します。
- [API Name (API 参照名)] に
SevenDaysAgoと入力します。
- [Data Type (データ型)] で [Date (日付)] を選択します。
- [Formula (数式)] に
TODAY()-7と入力します。
-
[Done (完了)] をクリックします。
- [リソース種別] で [数式] を選択します。
- [How Many Records to Store (保存するレコード数)] で、[All records (すべてのレコード)] を選択します。
- [How to Store Record Data (レコードデータの保存方法)] で、[Automatically store all fields (すべての項目を自動的に保存)] が選択されていることを確認します。
- [Label (表示ラベル)] に「
ループ要素を作成する
次に、商談のコレクションを処理するためのループ要素を作成します。
- [Get Opps Closed 7 Days Ago (7 日前にクローズされた商談を取得)] 要素の後にある
をクリックします。
-
[Loop (ループ)] を選択します。
- [Label (表示ラベル)] に
OppLoopと入力します。
[API Name (API 参照名)] にOppLoopと自動入力されます。
- [Collection Variable (コレクション変数)] で [Get Opps Closed 7 Days Ago (7 日前にクローズされた商談を取得)] を選択します。
- [Label (表示ラベル)] に

ループ内のアクションを作成する
最後に、コレクション内の各商談レコードに対して 1 回ずつ実行されるアクション要素をループ内に作成します。
これらの要素では、すべてのループ要素で自動的に生成される特別な変数である [Current Item from Loop (ループの現在の項目)] を使用します。ループが開始されるたびに、コレクション内の別の商談がこの [Current Item from Loop (ループの現在の項目)] 変数に格納され、その商談のすべての項目値をループ内の要素で使用できます。ループが再開されると、[Current Item from Loop (ループの現在の項目)] 変数内のデータはすべて削除され、次の商談の項目値を格納するための領域が確保されます。
- [For Each (各要素)] パスで
をクリックし、[Action (アクション)] を選択します。
- [Search Actions (アクションを検索)] で検索し、[Lock Record (レコードをロック)] を選択します。
- [Label (表示ラベル)] に「
Lock Opportunity(商談をロック)」と入力します。
[API Name (API 参照名)] にLock_Opportunityと自動入力されます。
- [Action (アクション)] に「
Lock(ロック)」と入力します。
[Lock Opportunity (商談をロック)] などの選択リストオプションは選択しないでください。項目には「Lock(ロック)」と入力します。
- [Record ID (レコード ID)] で [Current Item from Loop OppLoop (ループ OppLoop の現在の項目)] を選択し、次に [Opportunity ID (商談 ID)] を選択します。
この要素がループ内で実行されるたびに、現在ループを通過している商談の [Opportunity ID (商談 ID)] が使用されます。
- [Allowed ID (許可された ID)] で切り替えスイッチを [Included (含まれる)] に変更し、[Current Item from Loop OppLoop (ループ OppLoop の現在の項目)]、[Owner ID (所有者 ID)]、[Manager ID (マネージャー ID)] を順に選択します。
必ず [Manager ID (マネージャー ID)] 項目 (リスト内の 2 つ目の Manager ID) を選択し、マネージャー ID レコードは選択しないでください。
- [Label (表示ラベル)] に「
- [For Each (各要素)] パスで、[Lock Opportunity (商談をロック)] 要素の後に、もう 1 つアクション要素を追加します。
- [Search Actions (アクションを検索)] で検索し、[Post to Chatter (Chatter に投稿)] を選択します。
- [Label (表示ラベル)] に「
Opp Chatter Post(商談の Chatter 投稿)」と入力します。
[API Name (API 参照名)] にOpp_Chatter_Postと自動入力されます。
- [Message (メッセージ)] で [New Resource (新規リソース)] をクリックし、新しいテキストテンプレートを作成します。
- [リソース種別] で [テキストテンプレート] を選択します。
- [API Name (API 参照名)] に
PostBodyと入力します。
- [Body (本文)] に次の内容を入力します。このように、[Current Item from Loop (ループの現在の項目)] 変数の値、つまりループ変数の現在の項目 (この例では !OppLoop) は、リソース内でも使用できます。テキストテンプレート、数式、変数のデフォルト値で使用できます。[Current Item from Loop (ループの現在の項目)] 変数には、常にループ内を現在通過しているレコードの値が格納されている点に注意してください。
「@[{!OppLoop.OwnerId}] - This opportunity has now been locked. If you need to make changes, talk to your manager. (この商談はロックされています。変更したい場合はマネージャーに連絡してください。)」
-
[Done (完了)] をクリックします。
- [リソース種別] で [テキストテンプレート] を選択します。
- [Target Name or ID (対象の名前または ID)] で [Current Item from Loop OppLoop (ループ OppLoop の現在の項目)] > [Opportunity ID (商談 ID)] を選択します。
- [Label (表示ラベル)] に「
- フローを保存します。
- [Flow Label (フロー表示ラベル)] に「
Lock Closed Opps(クローズ済み商談をロック)」と入力します。
[API Name (API 参照名)] にLock_Closed_Oppsと自動入力されます。
- [Flow Label (フロー表示ラベル)] に「

これはアクションのみを含むシンプルなループですが、レコードを作成または編集する場合は、さらに複雑になります。
複数レコードをループで更新する
ループの中に [Get Records (レコードを取得)]、[Create Records (レコードを作成)]、[Update Records (レコードを更新)]、[Delete Records (レコードを削除)] 要素を配置しないでください。
各レコードごとに 1 回ずつ実行されるように、[Update Records (レコードを更新)] 要素をループ内に配置してレコードのグループを更新したくなるかもしれません。ただし、[Get Records (レコードを取得)]、[Create Records (レコードを作成)]、[Update Records (レコードを更新)]、[Delete Records (レコードを削除)] 要素は、SOQL クエリまたは DML 操作を実行します。フローでは、SOQL クエリは 100 回、DML 操作は 150 回までという制限があります。ループ内で処理されるレコード数に要素の数を掛け合わせると、これらの制限を簡単に超えてしまい、フローが失敗する原因になります。
では、これらの制限に達するのをどのように回避すればよいのでしょうか。[Get Records (レコードを取得)]、[Create Records (レコードを作成)]、[Update Records (レコードを更新)]、[Delete Records (レコードを削除)] 要素は、ループの外側に配置します。
- Get Records (レコードを取得): ループの前
- Create Records (レコードを作成)、Update Records (レコードを更新)、Delete Records (レコードを削除): ループの後
例を一緒に作成してみましょう。Pyroclastic Inc. では、ユーザーが Salesforce に定期的にログインしていることを確認したいと考えています。まず、無効な状態が 25 ~ 29 日目のユーザーに対して、警告メールを送信します。それでも 30 日間活動がない場合は、そのユーザーを無効化します。

組織内のすべてのユーザーレコードを取得した後、ループ要素を使用して、それらのユーザーを順に処理します。ループ内では、決定要素を使用して実行するアクションを判断し、30 日の条件の要件を満たすユーザーレコードについては、割り当て要素を使用して [Active (有効)] の値を False に変更します。最後に、ループの後で [Update Records (レコードを更新)] 要素を使用して、レコードの変更内容をデータベースに保存します。また、このフローでは、決定要素の条件の要件を評価するために、日付範囲を計算する数式も必要です。
このバッジでは、レコード更新に集中するため、メールを送信するアクション要素は省略します。
スケジュールフローと数式を作成する
まず、毎日実行されるスケジュールフローを作成します。次に、25 日前の日付を含む数式と、30 日前の日付を含む数式を作成します。
- スケジュールトリガーフローを作成します。
- [Set a Schedule (スケジュールを設定)] パネルで、[Start Date (開始日)] で今日の日付を選択します。
- [Start Time (開始時刻)] で [12:00 AM (午前 12 時 00 分)] (または [00:00]) を選択します。
- Frequency (頻度): [Daily (毎日)] を選択します。
- 25 日前の日付を計算するための数式リソースを作成します。
- [リソース種別] で [数式] を選択します。
- [API Name (API 参照名)] に
DaysAgo25と入力します。
- [Data Type (データ型)] で [Date (日付)] を選択します。
- [Formula (数式)] に
TODAY()-25と入力します。
-
[Done (完了)] をクリックします。
- [リソース種別] で [数式] を選択します。
- 次に、30 日前の日付を計算するための数式リソースを作成します。
- [リソース種別] で [数式] を選択します。
- [API Name (API 参照名)] に
DaysAgo30と入力します。
- [Data Type (データ型)] で [Date (日付)] を選択します。
- [Formula (数式)] に
TODAY()-30と入力します。
-
[Done (完了)] をクリックします。
- [リソース種別] で [数式] を選択します。
- フローを保存します。
- [Flow Label (フロー表示ラベル)] に「
Select Users to Deactivate(無効化するユーザーを選択)」と入力します。
[Flow API Name (フロー API 参照名)] にSelect_Users_to_Deactivateと自動入力されます。
- [Flow Label (フロー表示ラベル)] に「
ユーザーレコードを取得する
次に、[Get Records (レコードを取得)] 要素を使用して、すべてのユーザーレコードを取得します。
- キャンバスで
をクリックします。
-
[Get Records (レコードを取得)] を選択します。
- [Label (表示ラベル)] に「
Get Active Users(有効なユーザーを取得)」と入力します。
[API Name (API 参照名)] にGet_Active_Usersと自動入力されます。
- [オブジェクト] で [ユーザー] を選択します。
- [Condition Requirements (条件の要件)] で [All Conditions Are Met (AND) (すべての条件に一致 (AND))] を選択します。
- [Field (項目)] で [Active (有効)] を選択します。
- [Operator (演算子)] で [Equals (次の文字列と一致する)] を選択します。
- [Value (値)] で [True] をクリックします。
- [How Many Records to Store (保存するレコード数)] で、[All records (すべてのレコード)] を選択します。
- [How to Store Record Data (レコードデータの保存方法)] で、[Automatically store all fields (すべての項目を自動的に保存)] が選択されていることを確認します。
- [Label (表示ラベル)] に「
ループ要素を作成する
次に、ユーザーを順に処理するためのループ要素を作成します。
- [Get Active Users (有効なユーザーを取得)] 要素の後で
をクリックします。
-
[Loop (ループ)] を選択します。
- [Label (表示ラベル)] に
UserLoopと入力します。
[API Name (API 参照名)] にUserLoopと自動入力されます。
- [Collection Variable (コレクション変数)] で [Users from Get Active Users ([Get Active Users (有効なユーザーを取得)] から取得したユーザー)] を選択します。
- [Label (表示ラベル)] に
- フローを保存します。

決定要素で複数の結果を作成する
次に、各ユーザーに対してどの処理を行うかを判断するための決定要素を追加します。この要素により、ループ内に複数のパスが作成され、コレクション内の各項目はいずれか 1 つのパスを通ります。ループで各項目の処理が始まるたびに、その項目の条件に一致する決定結果のパスをフローが通ります。たとえば、あるユーザーでは 30 日以上前のパス、別のユーザーでは 25 日未満のパス、さらに別のユーザーでは 25 ~ 29 日のパスといったように、各ユーザーの最終ログイン日に応じて、通過するパスが変わります。
- [For Each (各要素)] パスで
をクリックします。
-
[決定] を選択します。
- [Label (表示ラベル)] に「
Days Since Last Login(最終ログイン以降の日数)」と入力します。
[API Name (API 参照名)] にDays_Since_Last_Loginと自動入力されます。
- [Label (表示ラベル)] に「
- [Outcome Details (結果の詳細)] を設定します。
- [Outcome Label (結果の表示ラベル)] に「
25 to 29(25 ~ 29 日)」と入力します。
[Outcome API Name (結果 API 参照名)] にX25_to_29と自動入力されます。
- [結果を実行する条件の要件] に [All Conditions Are Met (AND) (すべての条件に一致 (AND))] を選択します。
- [Resource (リソース)] で [Current Item from Loop UserLoop (ループ UserLoop の現在の項目)] を選択し、次に [Last Login (最終ログイン)] を選択します。
- [Operator (演算子)] に、[以上] を選択します。
- [Value (値)] で [DaysAgo25] を選択します。
-
[条件を追加] をクリックします。
- 2 つ目の [Resource (リソース)] でも [Current Item from Loop UserLoop (ループ UserLoop の現在の項目)] を選択し、[Last Login (最終ログイン)] を選択します。
- 2 つ目の [Operator (演算子)] で [Less Than (より小さい)] を選択します。
- 2 つ目の [Value (値)] で [DaysAgo30] を選択します。
- [Outcome Label (結果の表示ラベル)] に「
- 次の内容で新しい結果を作成します。
- [Outcome Label (結果の表示ラベル)] に「
30+(30 日超)」と入力します。
[Outcome API Name (結果 API 参照名)] にX30と自動入力されます。
- [結果を実行する条件の要件] に [All Conditions Are Met (AND) (すべての条件に一致 (AND))] を選択します。
- [Resource (リソース)] で [Current Item from Loop UserLoop (ループ UserLoop の現在の項目)] を選択し、次に [Last Login (最終ログイン)] を選択します。
- [Operator (演算子)] に、[以上] を選択します。
- [Value (値)] で [DaysAgo30] を選択します。
- [Outcome Label (結果の表示ラベル)] に「
- [Outcome Order (結果の順序)] で [Default Outcome (デフォルトの結果)] を選択します。
- [Label (表示ラベル)] に「
Less than 25(25 日未満)」と入力します。
- [Label (表示ラベル)] に「
- フローを保存します。

割り当て要素を使用してデータを編集および保存する
ループ内に [Update Records (レコードを更新)] 要素を配置するのはリスクがあるため、代わりに割り当て要素を使用して、[Current Item (現在の項目)] 変数のレコードを更新します。ここでは、[Active (有効)] 項目を False に設定します。
- [30+ (30 日超)] パスで
をクリックします。
-
[Assignment (割り当て)] を選択します。
- [Label (表示ラベル)] に「
Deactivate Current User(現在のユーザーを無効化)」と入力します。
[API Name (API 参照名)] にDeactivate_Current_Userと自動入力されます。
- [Variable (変数)] で [Current Item from Loop UserLoop (ループ UserLoop の現在の項目)] を選択し、次に [Active (有効)] を選択します。
- [Operator (演算子)] で [Equals (次の文字列と一致する)] を選択します。
- [Value (値)] で [False] を選択します。
- [Label (表示ラベル)] に「
これで [Current Item (現在の項目)] 変数には変更後の値が含まれますが、ループが再開されるたびに、フローは [Current Item (現在の項目)] 変数の内容を削除する点に注意してください。割り当てた変更を保存するには、変更後のデータを格納する別の変数が必要です。これは、ファイルのコピーを保存するようなイメージです。変更後のすべてのレコードを保持するために DeactivateUsers というレコードコレクション変数を作成し、割り当て要素を使用して、[Current Item (現在の項目)] 変数のコピーを [DeactivateUsers] 変数に追加します。
- [Assignment (割り当て)] パネルで [Add Assignment (割り当てを追加)] をクリックします。
- 2 つ目の [Variable (変数)] で [New Resource (新規リソース)] を選択します。
- [リソース種別] で [変数] を選択します。
- [API Name (API 参照名)] に
DeactivateUsersと入力します。
- [Data Type (データ型)] で [Record (レコード)] を選択します。
-
[Allow multiple values (collection) (複数の値を許可 (コレクション))] を選択します。
- [オブジェクト] で [ユーザー] を選択します。
- [リソース種別] で [変数] を選択します。
-
[Done (完了)] をクリックします。
これで、2 つ目の変数として [DeactivateUsers] 変数が作成されます。
- 2 つ目の [Operator (演算子)] で [Add (加算)] を選択します。
この演算子は計算のように見えますが、単なる加算ではありません。たとえば、テキスト同士を追加 (連結) したり、このケースのように、単一値の変数 ([Current Item from Loop UserLoop (ループ UserLoop の現在の項目)]) のコピーをコレクション変数に追加したりできます。
- 2 つ目の [Value (値)] で [Current Item from Loop UserLoop (ループ UserLoop の現在の項目)] を選択し、次に [Entire Resource (リソース全体)] を選択します。
- フローを保存します。

[Update Records (レコードを更新)] 要素を使用してレコードへの変更を確定する
[Users from Get Active Users ([Get Active Users (有効なユーザーを取得)] から取得したユーザー)] コレクション内のすべてのユーザーレコードに対する処理が完了すると、フローはループを終了し、[After Last (最後の項目の後)] パスに進みます。すべての変更が準備でき、ループが完了したこのタイミングが、実際のユーザーレコードを更新する最適なタイミングです。[Update Records (レコードを更新)] 要素を使用して、DeactivateUsers コレクションに格納されているすべてのレコード変更を反映します。
- [After Last (最後の項目の後)] パスで
をクリックします。
-
[レコードを更新] を選択します。
- [Label (表示ラベル)] に「
Deactivate User Collection Records(ユーザーコレクションレコードを無効化)」と入力します。
[API Name (API 参照名)] にDeactivate_User_Collection_Recordsと自動入力されます。
- [How to Find Records to Update and Set Their Values (更新するレコードを検索してその値を設定する方法)] で [Use the IDs and all field values from a record or record collection (レコードまたはレコードコレクションからの ID およびすべての項目値を使用)] が選択されていることを確認します。
- [Record or Record Collection (レコードまたはレコードコレクション)] で [DeactivateUsers] を選択します。
- フローを保存します。

これが、ループを使用してコレクションに対して変更を加える方法です。もしループの正しい作成方法を忘れてしまったら、「ループの前に必要なデータをすべて取得し、ループの後でレコードを変更する」と覚えておいてください。
