Salesforce フローのループ: 日付やシフトごとにレコードを作成
1 つの画面から、たくさんのレコードを。画面フロー (Screen Flow) を作る人なら誰もが必要とするループのパターンと、そのまま使える 3 つのスターターフロー (シフト、休暇、期間) を紹介します。
リクルーターが案件に 12 件のシフトを追加する。マネージャーが 1 週間の休暇を承認する。イベント担当者が 3 日間のワークショップとフォローアップの 1 日を予約する。どれも 1 つの画面での 1 つの判断ですが、それぞれ複数のレコードになるべきものです。
画面フローには「日付ごとに 1 件のレコードを作成する」という要素はありません。ループ、割り当て、1 回の保存という 3 つの標準部品で組み立てます。この記事ではそのパターンを順に解説し、それを使った 3 つの動くフローを提供します。
このパターンは、TalentRover 上での採用システム構築から生まれました。リクルーターは案件に一連のシフトを追加する必要がありましたが、1 件ずつレコードを入力する作業は、日程調整そのものより時間がかかっていました。日と時間を一度に選び、シフトの書き込みはループに任せる。それで解決し、どのオブジェクトでも同じように使えます。
5 つの要素で組むパターン
- 画面。 ユーザーがすべての日付と、必要なら時刻も、一度に選ぶ MultiDatePick のカレンダー。
- 解析。
Parse Date Entries from JSONアクションが、選択をフローでループできるリストに変換します。 - ループ。 「ループ」要素がリストを 1 件ずつ順に処理します。
- 割り当て。 ループの中で、エントリの日付と時刻をレコード変数にコピーし、そのレコードをレコードコレクション変数に追加します。
- レコードを作成。 ループの後、1 つの「レコードを作成」でコレクション全体を保存します。
保存をループの後に置く理由
ループの中に「レコードを作成」を置きたくなる気持ちはわかります。1 回まわれば 1 件のレコード。日付が 3 つなら動きますが、30 になると壊れます。「レコードを作成」は 1 つずつが別々のデータベース保存で、Salesforce が 1 つのトランザクションで許すのは 150 回まで。しかもその保存が起動するすべてのトリガーやフローと共有です。ループの中の保存は、日付ごとに 1 回ずつ消費します。
コレクションを組み立てて 1 回で保存すれば、ユーザーが何を選んでも保存は合計 1 回です。処理も速く、すべて保存されるか何も保存されないかのどちらかなので、失敗してシフトが半分だけ残ることもありません。
| ループの中で「レコードを作成」 | コレクションをループの後で保存 | |
|---|---|---|
| 30 日分の保存回数 | 30 | 1 |
| 制限に達するリスク | 選ぶ日付が増えるほど高まる | ループによるリスクはなし |
| エラー時 | 保存されるレコードとされないレコードが混在 | すべて保存か、何も保存しないか |
活用例: 案件にシフトを追加する
リクルーターは案件からフローを開き、カレンダーでシフトの日を、タイムグリッドで時間を選んで [次へ] をクリックします。フローは案件に紐付いたシフトを 1 日 1 件ずつ書き込みます。
カレンダーは選択を selectedDatesWithTimesJson 出力の JSON としてフローに渡します。フローは JSON を読めないので、ここでパーサーの出番です。返される各エントリには次の項目があります:
| 項目 | 種別 | 内容 |
|---|---|---|
fromDate | Date | シフトの日 |
toDate | Date | シフトなら同じ日、期間なら最終日 |
startTime | 時刻 | 最初に選んだ時間枠 |
endTime | 時刻 | 最後に選んだ時間枠の終了時刻 |
隣り合う時間枠は 1 つのシフトになるので、13:00 と 13:30 を選ぶと 13:00〜14:00 になります。1 日に離れた 2 つのブロック (たとえば午前と午後) を選ぶと、その日のエントリは 2 つになり、シフトも 2 件になります。
スターターフロー: Add Shifts
日と時間を選び、ブロックごとに 1 件のシフトを、フローの起動元レコードに紐付けて保存します。MDP_Starter_Add_Shifts.flow-meta.xml
活用例: 休暇 1 日ごとに 1 件のレコード
休暇はたいてい 1 日単位で管理されます。給与計算は日数で数えますし、一部だけ承認された申請はどのみち日ごとに分ける必要があります。この場合はパーサーすら不要です。Date コンポーネントは selectedDates も出力します。選んだすべての日を、期間も 1 日ずつ展開して並べた単純なテキストのリストです。
このリストをそのままループします。注意点は、各項目が 2026-11-09 のようなテキストであることだけです。割り当てでレコードにコピーする前に、DATEVALUE({!Loop_Days}) という 1 行の数式で日付に変換します。
スターターフロー: Record per Day
日と期間を選び、1 日ごとに 1 件のレコードを保存します。パーサーは不要です。MDP_Starter_Record_Per_Day.flow-meta.xml
活用例: 期間ごとに 1 件のレコード
複数日にまたがっていても 1 つのものがあります。3 日間のワークショップ、機材のレンタル、月曜から水曜までの現地訪問。これらは 3 件ではなく、開始日と終了日を持つ 1 件のレコードにしたいものです。
そのための出力が selectedDateRangesJson です。カレンダーは隣り合う日を 1 つの期間にまとめるので、9 日、10 日、11 日を選ぶと 9 日から 11 日までの 1 エントリになります。解析してループし、fromDate と toDate を開始日と終了日の項目にコピーします。
スターターフロー: Record per Range
日付と期間を選び、期間ごとに開始日と終了日を持つ 1 件のレコードを保存します。MDP_Starter_Record_Per_Range.flow-meta.xml
bookingSuccessCount で、競合した日付を bookingConflictDates でフローに返します。スターターフローを自社の組織で使う
スターターフローは MultiDatePick に付属する Schedule オブジェクトと Event オブジェクトに保存するので、そのままデプロイでき、インストール直後から動きます。動作を確認したら、自社のオブジェクトに差し替えてください。
- 上のフローの XML をコピーまたはダウンロードします。
- VS Code からデプロイします。手順は VS Code でフローをデプロイするで 1 ステップずつ解説しています。
- Flow Builder で開き、最初の画面のカレンダーをクリックします。セットアップウィザードで保存した設定、または Config Library からインポートした設定の Config Name(設定名) を入力すると、その設定が反映されます。
- Schedule と Event を使わない場合は、自社のオブジェクトを指定します。レコード変数のオブジェクトと、割り当ての中の項目を変更してください。
- 有効化し、フローコンポーネントまたはアクションとしてレコードページに追加します。フローはレコードの Id を
recordId変数から読み取ります。
午後をまるごと失うミス
- ループの中で保存する。 日付 3 つのテストでは問題なくても、本番で 40 個になると制限エラーになります。
- レコードをコレクションに追加し忘れる。 割り当てには 2 つの部分が必要です。項目を設定し、レコード変数をコレクションに Add (追加) すること。後者がないと、最後の保存で保存するものが何もありません。
- テキストを日付項目に割り当てる。
selectedDatesのリストはテキストです。まず各項目をDATEVALUE()で囲んでください。 - Output As JSON をオフのままにする。 JSON の出力は、カレンダーの Output As JSON 設定がオンのときにだけ値が入ります。スターターフローではオンにしてあります。
- 間違った場所から起動する。 フローは各レコードを
recordIdに紐付けます。レコードが属する案件、イベント、人のレコードから実行しないと、紐付けが空のままになります。
よくある質問
1 つの Salesforce 画面フローで複数のレコードを作成するには?
1 つの画面で選択を受け取り、それをループします。ループの中では「割り当て」でレコード変数に値を入れ、それをレコードコレクション変数に追加します。ループの後、1 つの「レコードを作成」要素でコレクション全体を保存します。
「レコードを作成」はフローのループの中に置くべきですか?
いいえ。ループの中の「レコードを作成」は項目ごとに 1 回ずつ保存し、1 つのトランザクションで許される保存は 150 回までです。そのため長いリストでは失敗し、どのリストでも処理が遅くなります。ループの中でレコードコレクション変数を組み立て、ループが終わった後に 1 回で保存してください。
Salesforce フローで JSON をループするには?
フローは単独では JSON を読めません。まずコレクションに変換します。MultiDatePick には Parse Date Entries from JSON というアクションが含まれており、カレンダーの JSON 出力を fromDate、toDate、startTime、endTime を持つエントリのリストに変換します。これを「ループ」要素で順に処理できます。
Salesforce で案件に複数のシフトを追加するには?
案件レコードから起動する画面フローに日付と時刻のピッカーを配置し、リクルーターにシフトの日と時間を選んでもらいます。選択をリストに解析し、それをループして、案件に紐付いたシフトレコードを 1 日 1 件ずつ組み立てます。ループの後、1 つの「レコードを作成」でまとめて保存します。
選んだ日付をループするのに Apex は必要ですか?
いいえ。解析用のアクションは MultiDatePick に付属しており、ループ、割り当て、保存はいずれも標準のフロー要素です。終日単位であればアクションすら不要です。カレンダーは選んだ日の単純なリストも出力するからです。
1 つの画面から、必要なレコードをすべて。
上のスターターフローをコピーするか、まずライブデモでカレンダーを試してください。
- $20/ユーザー/月ですべての機能
- 30 日間無料、カード不要
- 100% Salesforce ネイティブ
- Apex 不要
- Salesforce AppExchange で近日公開