Salesforce Flow モダナイゼーション は何をしますか?
モデルはデフォルトで、トレーニングデータにある Flow パターン(ループ+判断+代入、ループ内 DML、トリガーレコードの保存後更新、再計算のための追加画面)を採用します。このスキルはそれらを現在の要素に置き換え、各要素のデプロイ検証済みメタデータを examples/ に提供します。
以下のルールがほとんどの結果を決定します。
- 最新の要素がデフォルトです。 ループには明示的なエスケープ条件(後述)が必要です。要素の XML に不慣れな場合は、その要素を避けるのではなく、サンプルファイルから形状をコピーしてください。
- 検証不可は利用不可を意味しません。 利用可能性は組織の API バージョンと以下の表に従います。要素の最小 API バージョンが組織のバージョン以下の場合、その要素を使用するために Web アクセスは必要ありません。デプロイ検証が確認手段です。
- すべてのループと代替手段は説明されます。 ループの説明と成果物にエスケープ条件を明記してください。明記されたエスケープ条件がない限り、ループを作成しないでください。
ワークフロー
以下のチェックリストを作業ノートにコピーし、チェックを入れながら進めてください。
- [ ] 1. references/org-conventions.md を読む。このタスクが依存する未設定のスロットをリストアップする
- [ ] 2. 組織 API バージョンを確認する
- [ ] 3. タスクを分類する:構築、監査、または移行。フロータイプ、トリガーイベント、実行ユーザー
- [ ] 4. すべての要件を判断表にマッピングする。使用する各サンプルを開く
- [ ] 5. メタデータ(または構築仕様書)を作成する
- [ ] 6. scripts/check-flow.mjs を実行する。すべての ERROR を修正し、すべての WARNING を判断する
- [ ] 7. 組織が利用可能な場合はデプロイ検証を実行する。それ以外の場合は XML に未検証のラベルを付ける
- [ ] 8. references/delivery.md のレビューチェックリストを実行し、成果物を納品する
ステップ 1. 規約。 org-conventions.md で設定済みのスロットは、このスキルのデフォルトよりも優先されます。空のスロットはデフォルトが適用されることを意味し、成果物に未決定事項としてリストアップします。
ステップ 2. API バージョン。 組織がある場合、sf org display --target-org <エイリアス> で「API バージョン」が表示されます。組織がない場合は、プロジェクトの sfdx-project.json にある sourceApiVersion を使用し、それもない場合は 67.0 を使用し、その旨を明記します。新しいフローの apiVersion はそのバージョンに設定します。
ステップ 3. 分類。 既存のフローか新しい構築か。フロータイプ(画面、レコードトリガー保存前/保存後、自動起動、スケジュールトリガー、プラットフォームイベントトリガー)。トリガーオブジェクトとトリガーイベントは、サンプルを開く前に要件から回答します。問題は、既に条件を満たしているレコードが作成された場合もカウントするか、それとも条件を満たすように変更されたレコードのみかです。作成と更新で「条件を満たすように更新された場合のみ」は、そのような作成時にも起動しますが、更新のみでは起動しません。要件に明記されていない場合は、質問するか仮定を明記します(record-triggered.md)。実行ユーザー(ユーザー、システム、エージェント)。同期的に実行する必要があるもの。画面フローの場合、それを埋め込むサーフェスと、フローが受け取り返すものを確認します。
ステップ 4. マッピング。 各コレクション操作、選択肢リスト、画面操作、レコード更新、タイミング要件、統合について、判断表から該当する行を取得します。作成するすべての要素のサンプルファイルと、その制限に関するドメインリファレンスを読みます。タスクが扱うドメインのリファレンスのみを読みます。
ステップ 5. 作成。 メタデータは force-app/main/default/flows/<API名>.flow-meta.xml に配置します(プロジェクトのパッケージディレクトリに合わせて調整)。命名のデフォルト:フロー API 名は オブジェクト_動詞_条件、要素名は タイプ_目的(Get_Open_Cases、Filter_High_Priority、Transform_To_Tasks、Dec_Is_Renewal)。ただし、org-conventions.md で別の指定がある場合は除きます。明示的に有効化を依頼された場合、または activation-policy スロットで指定されている場合を除き、<status>Draft</status> に設定します。サンプルは実行されたために Active になっているだけです。同じタイプの要素はすべてファイル内でまとめて配置します(分割グループはデプロイに失敗します)。CLI がない場合は、delivery.md の形式で構築仕様書を納品します。
ステップ 6. チェック。 作成した、またはレビューを依頼されたすべてのフローに対してチェッカーを実行します。必要なのは Node のみです。
node <スキルディレクトリ>/scripts/check-flow.mjs --api <組織APIバージョン> force-app/main/default/flows/<API名>.flow-meta.xml
ERROR はレガシーパターンまたはプラットフォームが拒否する形式であるため、修正します。WARNING は判断が必要であり、その判断を成果物に明記します。
ステップ 7. 検証。 認証済みの組織がある場合、CLI のデフォルト組織に依存せず、組織を明示的に指定します。
sf project deploy validate --source-dir force-app/main/default/flows/<API名>.flow-meta.xml --target-org <エイリアス>
エラーメッセージに基づいて正確に修正し、再実行します。検証されなかった XML は、成果物に未検証と明記します。
ステップ 8. レビューと納品。 delivery.md のレビューチェックリストを実行します。成果物の最後に、次のブロックをすべての行を埋めて追加します。
モード: メタデータ | 構築仕様書
チェッカー: <コマンド> → <n> エラー, <n> 警告 (<警告ごとの判断>)
デプロイ検証: <コマンドと結果> | 未実行, 未検証 (<理由>)
ステータス: ドラフト | アクティブ (<理由>)
実行コンテキスト: <runInMode またはデフォルト、およびそれがこのフロータイプに対して意味すること>
エスケープ: <E-IDとループまたは代替手段ごとの理由> | なし
未決定事項: <このフローが依存する未設定の規約スロット> | なし
実行コンテキストのデフォルト(runInMode DefaultMode):レコードトリガー、スケジュールトリガー、プラットフォームイベントトリガーのフローは、共有なしのシステムコンテキストで実行されます。画面フローと自動起動フローは、UI または REST API から起動された場合はユーザーコンテキストで、Apex または別のフローから呼び出された場合は呼び出し元のコンテキストで実行されます。自動起動は「デフォルトでシステム」ではありません。
監査と移行
既存のフローについては、最初にチェッカーを実行し、次に判断表の最後の列に対して残りのレガシーパターンを棚卸しします。書き換えの前に、delivery.md で定義された監査レポートを、影響度(ガバナー制限 > セキュリティコンテキスト > ユーザーエクスペリエンス)でランク付けして納品します。依頼がない限りフローを変更しないでください。依頼があった場合は、レポートの移行計画に従って順番に進めてください。パターンを説明し、それを作成した人を説明しないでください。ほとんどのレガシーパターンは、作成当時は推奨されたアプローチだったからです。 プロセスビルダーとワークフロールールのマッピングは legacy-migration.md にあります。
判断表
「Org API」は、その要素を持つ最小の組織 API バージョンです(Flow、Metadata API 開発者ガイド)。サンプルは examples/flows/ にあり、API 67.0 でデプロイおよび実行されています。
| 要件 | 使用する要素 | メタデータ | Org API | サンプル | 置き換えるパターン |
|---|---|---|---|---|---|
| コレクションのうち条件に一致するアイテムを保持する | コレクションフィルター (条件または数式) | collectionProcessors, FilterCollectionProcessor | 53 | Opportunity_Create_Followup_Tasks | ループ + 判断 + 代入 |
| コレクションからレコードを構築する、フィールドを再形成する | トランスフォーム、マップ | transforms | 59 | Opportunity_Create_Followup_Tasks | ループ + 代入(コレクション構築) |
| コレクションの合計またはカウント | トランスフォーム、Sum / Count。保存前フローの場合、フィルター + 代入 AssignCount、または合計の場合はループ (E3) | transforms, inputParameters | 59 (プリミティブターゲット 62) | Opportunity_Create_Followup_Tasks, Account_Before_Save_Count_Contacts | ループカウンター |
| キーで2つのコレクションを結合する | トランスフォーム、InnerJoin、同じトランスフォーム内にマッピング | transforms, JoinDefinition | 63 | Opportunity_Create_Account_Tasks_Joined | ネストされたループ、ループ内のレコード取得 |
| コレクションを並べ替える | コレクションソート (その場でソート) | SortCollectionProcessor | 50 | Opportunity_Allocate_Budget_Waterfall | ループ内の手動ソート |
| 多数のレコードを作成、更新、または削除する | 準備されたコレクションに対する1つのDML | recordCreates inputReference | 任意 | Opportunity_Create_Followup_Tasks | ループ内 DML |
| レコードまたは選択リストからのオプション | レコード / 選択リスト選択肢セット | dynamicChoiceSets | 任意 | Account_Order_Entry_Screen | レコード取得 + 選択肢構築ループ |
| 入力に応じて変化する合計、表示、テキスト | リアクティブ数式、visibilityRule | formulas、画面フィールド | 59 | Account_Order_Entry_Screen | 再計算のための2番目の画面 |
| 画面上の入力ルール | コンポーネント validationRule | 画面 fields | 任意 | Account_Order_Entry_Screen | 画面後の判断からエラー画面への戻り |
| 画面から離れずにサーバー側ロジックを実行 | 画面アクション + アクションボタン | screens.actions, triggers | 59 | Account_Check_Pipeline_Screen | 次へ、レコード取得、戻る |
| トリガーレコードのフィールドを設定する | 保存前フロー、$Record への代入 | triggerType RecordBeforeSave | 任意 | Opportunity_Before_Save_Set_Next_Step | $Record への保存後更新レコード |
| メッセージで保存をブロックする | カスタムエラー | customErrors | 59 | Opportunity_Before_Save_Set_Next_Step | 保存後の補償 |
| 関連するフィールドが変更された場合のみ実行 | エントリ条件、ISCHANGED を使用した filterFormula、「条件を満たすように更新された場合のみ」 | start | 55 (数式) | Opportunity_Before_Save_Set_Next_Step, Opportunity_Closed_Won_Handover | 最初の要素としての判断 |
| ユーザーが待つ必要のない呼び出し、メール、無関係な DML | 非同期パス | scheduledPaths AsyncAfterCommit | 53 | Opportunity_Closed_Won_Handover | すべて同期 |
| レコード日付の前後の作業 | スケジュールパス | scheduledPaths RecordField | 51 | Opportunity_Closed_Won_Handover | 期限切れレコードをポーリングするスケジュールトリガーフロー |
| プラットフォームイベントに反応する | プラットフォームイベントトリガーフロー | triggerType PlatformEvent | 49 | Order_Event_Create_Task | Flow ロジックを開始するために記述された Apex トリガー |
| イベントが到着するまで一時停止 | プラットフォームイベントを使用した待機要素 | waits | 任意 | Order_Wait_For_Confirmation | ポーリング |
| Agentforce エージェント用のフローロジック | 説明された入力と出力を持つ自動起動フロー | variables description | 任意 | Case_Get_Status_For_Agent | 呼び出し可能な Apex ラッパー |
| 1つのオブジェクト上のフロー間の順序 | トリガー順序 | triggerOrder | 54 | Opportunity_Closed_Won_Handover | 作成順序への依存 |
| REST API を呼び出す | HTTP 呼び出しアクション | actionCalls (Builder 生成) | 統合リファレンス参照 | なし | 呼び出しのみのために記述された Apex |
トランスフォームは保存前フローでは許可されていません(デプロイエラー)。保存前はトランスフォームよりも優先されるため、トリガーレコードの値は保存前のままであり、そこでの合計は E3 に基づくループであり、保存後のトランスフォームと2回目の保存ではありません。上記のその他すべては、その概念を持つすべてのフロータイプで機能し、ドメインリファレンスに例外がリストされています。
エスケープ条件
レガシーパターンが正しいのは、次のいずれかに該当する場合のみです。ループの <description> に Escape: E<n> <理由> として宣言し、成果物にも記載します。
| ID | 許可されるもの | 該当する場合のみ |
|---|---|---|
| E1 | ループ | 各アイテムに、単一値のみを受け入れるアクション、サブフロー、または Apex プラグインへの個別の呼び出しが必要な場合。ループ本体にはその呼び出しが含まれます。 |
| E2 | ループ | アイテムの結果が、合計やカウントを超えて、以前のアイテムに依存する場合:変動残高、割り当て、シーケンス番号、ラウンドロビンなど。 |
| E3 | ループ | 保存前フローで合計が必要な場合(トランスフォームは許可されていません)。これは意図的なもので、インメモリループは保存後の2回目の保存よりも安価だからです。カウントは代わりにフィルター + AssignCount を使用します。 |
| E4 | 同期パスでの作業 | 同じトランザクションの後の要素が結果を読み取る場合、またはユーザーが保存の完了前に結果を確認する必要がある場合。 |
| E5 | リアクティブまたは新しい画面機能なし | 指定された埋め込みサーフェスがそれらをサポートしていない場合:Salesforce Classic ランタイム、Slack(コンポーネントセット制限)、またはリアクティブドキュメントが非リアクティブとしてリストしているコンポーネント。 |
| E6 | レガシーパターンをそのまま残す | 監査スコープのみ:フローは依頼された変更の範囲外です。新規または書き換えられたフローには決して適用されません。 |
以下はエスケープ条件としてカウントされません。
- 「この組織に要素が存在することを確認できない」(ルール2が適用されるため、API バージョンを確認し、デプロイ検証を実行してください)。
- 「XML がわからない」(サンプルをコピーしてください)。
- 「ループの方がシンプルまたは明確です。」
- 「アイテムごとの条件付き値」(トランスフォーム数式で
IF()を使用してください)。 - 「フィルターとマップを1回のパスで」(フィルター、次にトランスフォーム)。
- 「サーフェスがサポートしない可能性がある」(サーフェスを指定するか、未決定事項としてリストアップしてください。不明なサーフェスは E5 ではありません)。
- ループ内での DML またはレコード取得。それらを許可するエスケープ条件はありません。
最もシンプルで十分な要素を使用してください。つまり、フィルタリングのみの場合はフィルター単独、オプションリストが固定の場合は静的な選択肢、呼び出し元が1つのロジックにはサブフローは不要です。
確認する前に主張しない
- 利用可能性:組織 API バージョンと表を照合します。ライセンス制限のある機能(Agentforce、Einstein、Data 360、一部のオーケストレーションエディション)は、組織が確認するまで仮定として扱い、その旨を明記します。
- 設計や監査結果を変える制限と GA 状況:公式ソース(help.salesforce.com、developer.salesforce.com)を引用します。記憶から数値を引用しないでください。ドメインリファレンスに検証済みの数値が記載されています。
エラー処理
- CLI がない、または組織に到達できない:未検証のラベルが付いたメタデータ、または構築仕様書を納品し、その旨を明記します。
- 検証が失敗する:正確なメッセージに基づいて修正し、チェッカーと検証を再実行します。ドメインリファレンスには、これまでに確認されたデプロイエラーがリストされています。
- 機能が組織にない(API バージョン、エディション、ライセンス):表の最も近いサポート行を使用し、ギャップとエスケープを明記します。
リファレンス
タスクに必要なものを読んでください。
- org-conventions.md:チームの決定事項。デフォルトよりも優先されます。
- collections.md:フィルター、ソート、トランスフォーム(マップ、合計、カウント、結合)、一括 DML、ループ。
- screens.md:選択肢セット、リアクティブ画面、検証、画面アクション、埋め込み。
- record-triggered.md:エントリ条件、$Record、保存前/保存後、実行コンテキスト。
- legacy-migration.md:プロセスビルダーとワークフロールールのマッピング。
- delivery.md:監査レポート、構築仕様書、レビューチェックリスト、納品ブロックの形式。
- integration.md(統合リファレンス):HTTP 呼び出し、サブフロー、Apex アクション、エージェントアクション。制限と管理方法。