Skip to main content

ループを作成する

学習の目的

この単元を完了すると、次のことができるようになります。

  • フローでループ要素を作成する。
  • フローループの外側にデータ要素を配置して、フローエラーを回避する。
メモ

メモ

日本語で受講されている方へ
Challenge は日本語の Trailhead Playground で開始し、かっこ内の翻訳を参照しながら進めていってください。Challenge での評価は英語データを対象に行われるため、英語の値のみをコピーして貼り付けるようにしてください。日本語の組織で Challenge が不合格だった場合は、(1) この手順に従って [Locale (地域)] を [United States (米国)] に切り替え、(2) [Language (言語)] を [English (英語)] に切り替えてから、(3) [Check Challenge (Challenge を確認)] ボタンをクリックしてみることをお勧めします。

翻訳版 Trailhead を活用する方法の詳細は、自分の言語の Trailhead バッジを参照してください。

Note

このバッジは、Flow Builder のスキルを習得するための過程の一部です。「Flow Builder を使用したフローの作成」トレイルでは、初めから終わりまで Flow Builder について学習します。このトレイルで推奨されるバッジの順序に従えば、プロセスの自動化に関する確固たるスキルが身に付き、Flow Builder のエキスパートになります。

ループでアクションを使用する

Flow Builder でループを作成します。前の単元で Pyroclastic Inc. が使用していたフローを作成しましょう。このフローは毎日実行され、クローズから 7 日が経過したすべての商談レコードを特定し、それらの商談レコードをロックして、商談の Chatter フィードに投稿します。

スケジュールフローを作成して商談を取得する

まず、毎日実行されるスケジュールフローを作成します。次に、[Get Records (レコードを取得)] 要素を使用して、[Close Date (完了予定日)] が 7 日以上前のすべての商談を取得します。多くの場合、フローの開始要素で商談を取得できますが、7 日前の日付を判定するには数式が必要です。開始要素は数式をサポートしていないため、[Get Records (レコードを取得)] 要素を使用します。

  1. スケジュールトリガーフローを作成します。
  2. [Set a Schedule (スケジュールを設定)] パネルで、[Start Date (開始日)] で今日の日付を選択します。
  3. [Start Time (開始時刻)] で [12:00 AM (午前 12 時 00 分)] (または [00:00]) を選択します。
  4. Frequency (頻度): [Daily (毎日)] を選択します。
  5. キャンバスで 要素を追加 をクリックします。
  6. [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 (すべての項目を自動的に保存)] が選択されていることを確認します。

ループ要素を作成する

次に、商談のコレクションを処理するためのループ要素を作成します。

  1. [Get Opps Closed 7 Days Ago (7 日前にクローズされた商談を取得)] 要素の後にある 要素を追加 をクリックします。
  2. [Loop (ループ)] を選択します。
    • [Label (表示ラベル)] に OppLoop と入力します。
      [API Name (API 参照名)] に OppLoop と自動入力されます。
    • [Collection Variable (コレクション変数)] で [Get Opps Closed 7 Days Ago (7 日前にクローズされた商談を取得)] を選択します。

前述の手順に対応する Flow Builder キャンバス。

ループ内のアクションを作成する

最後に、コレクション内の各商談レコードに対して 1 回ずつ実行されるアクション要素をループ内に作成します。

これらの要素では、すべてのループ要素で自動的に生成される特別な変数である [Current Item from Loop (ループの現在の項目)] を使用します。ループが開始されるたびに、コレクション内の別の商談がこの [Current Item from Loop (ループの現在の項目)] 変数に格納され、その商談のすべての項目値をループ内の要素で使用できます。ループが再開されると、[Current Item from Loop (ループの現在の項目)] 変数内のデータはすべて削除され、次の商談の項目値を格納するための領域が確保されます。

  1. [For Each (各要素)] パスで 要素を追加 をクリックし、[Action (アクション)] を選択します。
  2. [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 レコードは選択しないでください。
  3. [For Each (各要素)] パスで、[Lock Opportunity (商談をロック)] 要素の後に、もう 1 つアクション要素を追加します。
  4. [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 (本文)] に次の内容を入力します。
        「@[{!OppLoop.OwnerId}] - This opportunity has now been locked. If you need to make changes, talk to your manager. (この商談はロックされています。変更したい場合はマネージャーに連絡してください。)」
        このように、[Current Item from Loop (ループの現在の項目)] 変数の値、つまりループ変数の現在の項目 (この例では !OppLoop) は、リソース内でも使用できます。テキストテンプレート、数式、変数のデフォルト値で使用できます。[Current Item from Loop (ループの現在の項目)] 変数には、常にループ内を現在通過しているレコードの値が格納されている点に注意してください。
      • [Done (完了)] をクリックします。
    • [Target Name or ID (対象の名前または ID)] で [Current Item from Loop OppLoop (ループ OppLoop の現在の項目)] > [Opportunity ID (商談 ID)] を選択します。
  5. フローを保存します。
    • [Flow Label (フロー表示ラベル)] に「Lock Closed Opps (クローズ済み商談をロック)」と入力します。
      [API Name (API 参照名)] に Lock_Closed_Opps と自動入力されます。

前述の手順に対応する Flow Builder キャンバス。

これはアクションのみを含むシンプルなループですが、レコードを作成または編集する場合は、さらに複雑になります。

複数レコードをループで更新する

ループの中に [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 日前の日付を含む数式を作成します。

  1. スケジュールトリガーフローを作成します。
  2. [Set a Schedule (スケジュールを設定)] パネルで、[Start Date (開始日)] で今日の日付を選択します。
  3. [Start Time (開始時刻)] で [12:00 AM (午前 12 時 00 分)] (または [00:00]) を選択します。
  4. Frequency (頻度): [Daily (毎日)] を選択します。
  5. 25 日前の日付を計算するための数式リソースを作成します。
    • [リソース種別] で [数式] を選択します。
    • [API Name (API 参照名)] に DaysAgo25 と入力します。
    • [Data Type (データ型)] で [Date (日付)] を選択します。
    • [Formula (数式)] に TODAY()-25 と入力します。
    • [Done (完了)] をクリックします。
  6. 次に、30 日前の日付を計算するための数式リソースを作成します。
    • [リソース種別] で [数式] を選択します。
    • [API Name (API 参照名)] に DaysAgo30 と入力します。
    • [Data Type (データ型)] で [Date (日付)] を選択します。
    • [Formula (数式)] に TODAY()-30 と入力します。
    • [Done (完了)] をクリックします。
  7. フローを保存します。
    • [Flow Label (フロー表示ラベル)] に「Select Users to Deactivate (無効化するユーザーを選択)」と入力します。
      [Flow API Name (フロー API 参照名)] に Select_Users_to_Deactivate と自動入力されます。

ユーザーレコードを取得する

次に、[Get Records (レコードを取得)] 要素を使用して、すべてのユーザーレコードを取得します。

  1. キャンバスで 要素を追加 をクリックします。
  2. [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 (すべての項目を自動的に保存)] が選択されていることを確認します。

ループ要素を作成する

次に、ユーザーを順に処理するためのループ要素を作成します。

  1. [Get Active Users (有効なユーザーを取得)] 要素の後で 要素を追加 をクリックします。
  2. [Loop (ループ)] を選択します。
    • [Label (表示ラベル)] に UserLoop と入力します。
      [API Name (API 参照名)] に UserLoop と自動入力されます。
    • [Collection Variable (コレクション変数)] で [Users from Get Active Users ([Get Active Users (有効なユーザーを取得)] から取得したユーザー)] を選択します。
  3. フローを保存します。

前述の手順に対応する Flow Builder キャンバス。

決定要素で複数の結果を作成する

次に、各ユーザーに対してどの処理を行うかを判断するための決定要素を追加します。この要素により、ループ内に複数のパスが作成され、コレクション内の各項目はいずれか 1 つのパスを通ります。ループで各項目の処理が始まるたびに、その項目の条件に一致する決定結果のパスをフローが通ります。たとえば、あるユーザーでは 30 日以上前のパス、別のユーザーでは 25 日未満のパス、さらに別のユーザーでは 25 ~ 29 日のパスといったように、各ユーザーの最終ログイン日に応じて、通過するパスが変わります。

  1. [For Each (各要素)] パスで 要素を追加 をクリックします。
  2. [決定] を選択します。
    • [Label (表示ラベル)] に「Days Since Last Login (最終ログイン以降の日数)」と入力します。
      [API Name (API 参照名)] に Days_Since_Last_Login と自動入力されます。
  3. [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] を選択します。
  4. 次の内容で新しい結果を作成します。
    • [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] を選択します。
  5. [Outcome Order (結果の順序)] で [Default Outcome (デフォルトの結果)] を選択します。
    • [Label (表示ラベル)] に「Less than 25 (25 日未満)」と入力します。
  6. フローを保存します。

前述の手順に対応する Flow Builder キャンバス。

割り当て要素を使用してデータを編集および保存する

ループ内に [Update Records (レコードを更新)] 要素を配置するのはリスクがあるため、代わりに割り当て要素を使用して、[Current Item (現在の項目)] 変数のレコードを更新します。ここでは、[Active (有効)] 項目を False に設定します。

  1. [30+ (30 日超)] パスで 要素を追加 をクリックします。
  2. [Assignment (割り当て)] を選択します。
    • [Label (表示ラベル)] に「Deactivate Current User (現在のユーザーを無効化)」と入力します。
      [API Name (API 参照名)] に Deactivate_Current_User と自動入力されます。
    • [Variable (変数)] で [Current Item from Loop UserLoop (ループ UserLoop の現在の項目)] を選択し、次に [Active (有効)] を選択します。
    • [Operator (演算子)] で [Equals (次の文字列と一致する)] を選択します。
    • [Value (値)] で [False] を選択します。

これで [Current Item (現在の項目)] 変数には変更後の値が含まれますが、ループが再開されるたびに、フローは [Current Item (現在の項目)] 変数の内容を削除する点に注意してください。割り当てた変更を保存するには、変更後のデータを格納する別の変数が必要です。これは、ファイルのコピーを保存するようなイメージです。変更後のすべてのレコードを保持するために DeactivateUsers というレコードコレクション変数を作成し、割り当て要素を使用して、[Current Item (現在の項目)] 変数のコピーを [DeactivateUsers] 変数に追加します。レコード 2 は、コレクション変数からコピーされ、割り当て要素によって変更され、別のコレクション変数に移動されます。

  1. [Assignment (割り当て)] パネルで [Add Assignment (割り当てを追加)] をクリックします。
  2. 2 つ目の [Variable (変数)] で [New Resource (新規リソース)] を選択します。
    • [リソース種別] で [変数] を選択します。
    • [API Name (API 参照名)] に DeactivateUsers と入力します。
    • [Data Type (データ型)] で [Record (レコード)] を選択します。
    • [Allow multiple values (collection) (複数の値を許可 (コレクション))] を選択します。
    • [オブジェクト] で [ユーザー] を選択します。
  3. [Done (完了)] をクリックします。
    これで、2 つ目の変数として [DeactivateUsers] 変数が作成されます。
  4. 2 つ目の [Operator (演算子)] で [Add (加算)] を選択します。
    この演算子は計算のように見えますが、単なる加算ではありません。たとえば、テキスト同士を追加 (連結) したり、このケースのように、単一値の変数 ([Current Item from Loop UserLoop (ループ UserLoop の現在の項目)]) のコピーをコレクション変数に追加したりできます。
  5. 2 つ目の [Value (値)] で [Current Item from Loop UserLoop (ループ UserLoop の現在の項目)] を選択し、次に [Entire Resource (リソース全体)] を選択します。
  6. フローを保存します。
Note

割り当て行を 1 行ずつ持つ割り当て要素を 2 つ作成する代わりに、1 つの割り当て要素に 2 行の割り当てを設定できます。割り当て要素では、割り当て行は常に順番に実行されるため、1 つの要素で十分です。

前述の手順に対応する Flow Builder キャンバス。

[Update Records (レコードを更新)] 要素を使用してレコードへの変更を確定する

[Users from Get Active Users ([Get Active Users (有効なユーザーを取得)] から取得したユーザー)] コレクション内のすべてのユーザーレコードに対する処理が完了すると、フローはループを終了し、[After Last (最後の項目の後)] パスに進みます。すべての変更が準備でき、ループが完了したこのタイミングが、実際のユーザーレコードを更新する最適なタイミングです。[Update Records (レコードを更新)] 要素を使用して、DeactivateUsers コレクションに格納されているすべてのレコード変更を反映します。

  1. [After Last (最後の項目の後)] パスで 要素を追加 をクリックします。
  2. [レコードを更新] を選択します。
  3. [Label (表示ラベル)] に「Deactivate User Collection Records (ユーザーコレクションレコードを無効化)」と入力します。
    [API Name (API 参照名)] に Deactivate_User_Collection_Records と自動入力されます。
  4. [How to Find Records to Update and Set Their Values (更新するレコードを検索してその値を設定する方法)] で [Use the IDs and all field values from a record or record collection (レコードまたはレコードコレクションからの ID およびすべての項目値を使用)] が選択されていることを確認します。
  5. [Record or Record Collection (レコードまたはレコードコレクション)] で [DeactivateUsers] を選択します。
  6. フローを保存します。

前述の手順に対応する Flow Builder キャンバス。

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

リソース

Salesforce ヘルプで Trailhead のフィードバックを共有してください。

Trailhead についての感想をお聞かせください。[Salesforce ヘルプ] サイトから新しいフィードバックフォームにいつでもアクセスできるようになりました。

詳細はこちら フィードバックの共有に進む