Salesforce 画面フロー (Screen Flow) でユーザーに複数の日付を選ばせる方法
フローの日付項目は、1 つの画面要素につき 1 つだけです。9 日分を選んでもらう必要があるなら、それが壁になります。選択肢とそれぞれのトレードオフを整理しました。
管理者なら誰もが一度はぶつかる問題です。休暇申請、勤務可能日の回答フォーム、研修の申し込み。ユーザーは連続しているとは限らない複数の日付を選ぶ必要があるのに、フロー標準の日付コンポーネントで受け取れるのはちょうど 1 つだけです。
よくある回避策と、その問題点
| 方法 | やり方 | 代償 |
|---|---|---|
| 1 つの画面に日付項目を複数並べる | 日付 1、日付 2、日付 3、日付 4... | 上限が固定で見た目も悪く、ほとんどが空欄 |
| 1 つずつ尋ねるループ | 「別の日付を追加しますか?」と聞いて画面に戻る | 3 日を超えるとかなりの苦痛 |
| 自由入力のテキスト項目 | ユーザーが日付を文字で入力する | 解析できず、レポートにも使えず、ミスも多い |
| 開始日と終了日だけ | 1 つの連続した期間として扱う | 日付が連続していなければ必ず間違う |
| 日付の複数選択リスト | 日付の値をあらかじめ作っておく | すぐに古くなり、常にメンテナンスが必要 |
| 複数日付のカレンダーコンポーネント | 必要な日付を 1 つの画面ですべてクリック | コレクションを返すので、そのままループできる |
開始日と終了日の回避策は最もよく使われ、そして最も気付かれにくい間違いを生みます。「3 日、4 日、11 日、18 日に休みたい」が「3 日から 18 日まで」になり、16 日間不在という扱いになってしまいます。データは一見きれいでも、単に間違っています。
本当の解決策: コレクションを返す画面コンポーネント
フローに本当に必要なのは、ユーザーが好きなだけ日付をクリックでき、それをコレクションとして返してくれる画面コンポーネントです。これさえあれば、残りはごく普通のフローです。コレクションをループして、日付ごとにレコードを作成すれば完了です。
MultiDatePick は、受け取りたい内容に応じて複数の出力を返します:
| 出力 | 内容 | API 参照名 |
|---|---|---|
| Selected Dates | ISO 形式の日付のテキストコレクション。そのままループ可能 | selectedDates |
| Date Ranges JSON | 連続する日を 1 件のレコードにまとめたい場合の、統合された期間 | selectedDateRangesJson |
| Dates With Times JSON | 日付ごとの開始時刻と終了時刻 | selectedDatesWithTimesJson |
| Successful Bookings Count、Conflict Dates | 保存できたものと、競合したもの | bookingSuccessCount |
JSON をレコードに戻す
出力のうち 2 つが JSON なのは、フローに「複数の項目を持つオブジェクトのリスト」を表すネイティブな型がないためです。数式でテキストを解析する必要はありません。パッケージには Parse Date Entries from JSON というフローアクションが付属しており、JSON を受け取って From Date、To Date、Start Time、End Time を持つ正式なコレクションを返します。あとは他のコレクションと同じようにループするだけです。
1 時間を無駄にしがちな落とし穴
$GlobalConstant.True または $GlobalConstant.False を指定する必要があります。
レコードの保存もコンポーネントに任せたい場合は、親レコードの Id を Parent Record Id に渡してください。日付ごとに子レコードを 1 件ずつ作成します。空欄のままにすれば、出力をループして自分の方法でレコードを作成できます。
作る前にレコードの形を決める
同じ 9 つの選択日でも、9 件のレコードにも、連続する日を期間にまとめて 4 件のレコードにも、サブブロックを持つ 1 件の親レコードにもできます。どれが正しいかは、必要なレポートによって変わります。フローを作る前に決めておきましょう。後から変えると、フローの修正だけでなくデータの移行も必要になるからです。
次のフローには本物の複数日付ピッカーを
ライブデモで日付をクリックしてみてから、「はじめに」の手順に沿ってフロー画面にコンポーネントを追加してください。
- $20/ユーザー/月ですべての機能
- 30 日間無料、カード不要
- 100% Salesforce ネイティブ
- Apex 不要
- Salesforce AppExchange で近日公開