フローをスケジュールする
学習の目的
この単元を完了すると、次のことができるようになります。
- 事前に決められた時間に実行されるフローを作成する。
- 特定の条件に一致するすべてのレコードに対して、スケジュールトリガーフローを実行する。
スケジュールトリガーフローとスケジュール済みパスの比較
「レコードトリガーフロー」バッジでは、スケジュール済みパスについて学びました。スケジュール済みパスは、トリガーから一定時間が経過した後や、トリガーレコードの日付の前後に、要素を実行できます。これは、作成、更新、削除されるレコードがトリガーとなります。では、レコードによってトリガーされない自動化を、特定の時間やスケジュールで実行したい場合はどうすればよいでしょうか? それには、スケジュールトリガーフローが必要です。
スケジュールトリガーフローは、自動起動フローファミリーの 1 つです。控えめでつい忘れられがちですが、とても頼りになる弟分のような存在です。
スケジュールに従って何かを実行する必要がある場合、スケジュール済みパスとスケジュールトリガーフローの違いを考慮してください。
考慮事項 |
スケジュール済みパス |
スケジュールトリガーフロー |
|---|---|---|
フロー種別 |
レコードトリガー |
スケジュールトリガー |
トリガー |
レコードが作成、更新、または削除された |
特定の日時 |
いつ |
トリガーから指定された時間が経過した後 または トリガーレコードの日付の前後に指定された時間 |
特定の日時 |
頻度 |
トリガーされるたびに 1 回実行 |
1 回、毎日、または毎週実行できる |
スケジュールトリガーフローを使用する理由
スケジュールトリガーフローは、設定に応じて 1 回、毎日、または毎週実行できます。まさに、自動化そのものを自動化するしくみです。スケジュールトリガーフローは、組織のデータ管理やユーザーへのメッセージ送信といった定期的な作業を処理するために使用します。たとえば、スケジュール済みフローでは、次のようなことができます。
-
未完了の ToDo やオープン期間が長すぎるケースを自動的にエスカレーションする。
優先度を引き上げる、またはより注目されやすい状況に変更します。エスカレーションを主要な担当者に通知することもできます。「Sal さん、この ToDo は 42 日間オープンのままです。」
-
取引先責任者の未入力の項目値を確認し、作成者にデータ入力を促すメールを送信する。
必要なデータがすべて揃う前に、がレコードを作成しなければならない場合があります。スケジュールトリガーフローを使用して、後日重要な値を入力するように促すことができます。「Sal さん、この取引先責任者のメールアドレスはもう入手できている頃ですよね。」
-
夜間に変更のバッチを適用する。
フローで変更を定義できれば、それらをバッチ単位で適用できます。CSV ファイルからの更新を適用することはできませんが、たとえば Sal のデータ入力が来週までに改善されなければ、彼が担当する北西部テリトリーの取引先をほかの担当者にまとめて再割り当てすることは可能です。(もっとも、彼のマネージャーから依頼されない限り、そうすべきではありませんが!)

多くの場合、スケジュール済みパスとスケジュールトリガーフローのどちらでも使用できます。主な違いは、スケジュール済みパスはレコードの変更に基づいて実行されるのに対し、スケジュールトリガーフローは特定の時刻と指定された頻度で処理を実行する点です。取引先責任者の作成者に、未入力の項目値を入力するよう促すリマインダーを自動化する例を考えてみましょう。
スケジュール済みパスでは、取引先責任者が作成された数日後に各作成者にメールを送信できます。タイミングは取引先責任者の作成日に基づき、スケジュール済みパスは 1 回実行されます。
スケジュールトリガーフローは、毎週日曜日の夜に、未入力項目がある取引先責任者に関する通知を送信できます。これにより、作成者は月曜日の朝に、不足データに一度に対応できます。タイミングが設定され、フローは毎週実行されます。レコードが修正されない場合、その作成者は、未入力の項目値を修正するまで毎週日曜日にリマインダーを受け取ります。
まとめると、スケジュールトリガーフローは、次の場合に使用します。
- 特定の時刻に実行する。
- レコードの変更とは関係なく実行する。
- 多数のレコードを一度に処理する。
- 毎日または毎週実行する。
Pyroclastic のサポートマネージャーは、毎日の始まりに優先度高のケースの数を継続的に記録したいと考えています。このメトリクスをレポートで活用できる形で記録するため、Flo はあなたに、毎日のケース数を保存するカスタムオブジェクトを作成し、そのケース数を記録するスケジュールトリガーフローを作成するよう依頼しました。
始める前に
スケジュールトリガーフローを作成する前に、定義しておくべき設定が 3 つあります。一部は、すでに本番組織で設定されている可能性がありますが、確認しておくことをお勧めします。スケジュール済みフローを作成する前に、このバッジで使用する Trailhead Playground で、これらの設定が正しいことを確認してください。
-
[Default Workflow User (デフォルトのワークフローユーザー)] を設定します。
スケジュールトリガーフローを実行するには、フローの実行ユーザーを指定する必要があります。[Setup (設定)] の [Process Automation Settings (プロセスの自動化設定)] ページで [Default Workflow User (デフォルトのワークフローユーザー)] が選択されていることを確認します。
-
[Automated Process User Email Address (自動化プロセスユーザーのメールアドレス)] を設定します。
スケジュールトリガーフローでメールを送信する場合、送信者として使用するメールアドレスを指定する必要があります。このアドレスを設定するには、まずそれを組織のメールアドレスとして定義します。次に、[Setup (設定)] の [Process Automation Settings (プロセスの自動化設定)] ページで、[Automated Process User Email Address (自動化プロセスユーザーのメールアドレス)] 項目に、その組織のメールアドレスを入力します。![[プロセスの自動化設定] ページ。[Default Workflow User (デフォルトのワークフローユーザー)] は Flo Smith、[Automated Process User Email Address (自動化プロセスユーザーのメールアドレス)] は fsmith@pyroclastic.com です。](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/autolaunched-scheduled-flows/schedule-a-flow/images/ja-JP/cc9db9fc4cfc34b9f725a78f4fac54ff_kix.h9ei5h6bnfjy.png)
-
[Default Time Zone (デフォルトのタイムゾーン)] を設定します。
スケジュールトリガーフローは、Salesforce 組織のデフォルトタイムゾーンに基づきます。この設定は、[Setup (設定)] の [Company Information (組織情報)] ページにあります。意図しないタイミングでの実行を防ぐために、フローをスケジュールする前にこの設定を確認してください。また、デフォルトのタイムゾーンを変更すると、組織内のほかの処理のタイミングも変更される可能性があることに留意してください。
カスタムオブジェクトを作成する
まず、毎日のケース数を保存するカスタムオブジェクトを作成します。
- カスタムオブジェクトを作成する:
- Label (表示ラベル):
Archived Metric(アーカイブ済みメトリクス) - Plural Label (表示ラベル (複数形)):
Archived Metrics - Starts with vowel sound (母音で始まる場合はチェック): オン
- Record Name (レコード名):
Archived Metric Number(アーカイブ済みメトリクス番号) - Data Type (データ型): Auto Number (自動採番)
- Display Format (表示形式):
Archive-{000000}(アーカイブ-) - Starting Number (開始番号):
1 - Allow Reports (レポートを許可): オン
- Archived Metric (アーカイブ済みメトリクス) オブジェクトにカスタム項目を作成します。
- Data Type (データ型): Number (数値)
- Field Label (項目の表示ラベル):
Value(値)
フローをスケジュールする
いくつかの例外を除き、スケジュールトリガーフローには、ほかのほとんどのフロー種別と同じコンポーネントと機能があります。詳細は、「Schedule-Triggered Flow Considerations (スケジュールトリガーフローに関する考慮事項)」を参照してください。
- スケジュールトリガーフローを作成します。
- フローのスケジュールを設定します。
-
[Set Schedule (スケジュールを設定)] をクリックします。
![[Set Schedule (スケジュールを設定)] と [Choose Object (Optional) (オブジェクトを選択 (省略可能))] という の 2 つのメニュー項目が表示されている開始要素](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/autolaunched-scheduled-flows/schedule-a-flow/images/ja-JP/5431c46ab27cf2a0d9e1b7278606bd6a_kix.yrcpngk45c7p.png)
- Start Date (開始日): 明日の日付を入力します。
- Start Time (開始時刻): 現在の時刻を入力します。
- Frequency (頻度): [Daily (毎日)] を選択します。
- [Get Records (レコードを取得)] 要素を追加します。
- Label (表示ラベル):
Get High Priority Cases(優先度高のケースを取得) - API Name (API 参照名):
Get_High_Priority_Cases - Object (オブジェクト): Case (ケース)
- 条件の要件: [すべての条件に一致 (AND)]
- Field (項目): Priority (優先度)、Operator (演算子): Equals (次の文字列と一致する)、Value (値): High (高)
- Field (項目): Closed (クローズ)、Operator (演算子): Equals (次の文字列と一致する)、Value (値): False
- Field (項目): Priority (優先度)、Operator (演算子): Equals (次の文字列と一致する)、Value (値): High (高)
- How Many Records to Store (保存するレコード数): All records (すべてのレコード)
- レコードデータの保存方法: すべての項目を自動的に保存
- 変数リソースを作成します。
- API Name (API 参照名):
caseCount - Data Type (データ型): Number (数値)
- Decimal Places (小数点の位置):
0 - Default Value (デフォルト値):
0
- [Get Records (レコードを取得)] 要素の後に、[Assignment (割り当て)] 要素を追加します。
- Label (表示ラベル):
Count Cases - API Name (API 参照名):
Count_Cases
- Variable (変数): caseCount
- Operator (演算子): Equals Count (次の数と一致する)
[Equals Count (次の数と一致する)] 演算子は、値のリソースに含まれる値の数をカウントし、その数を変数のリソースに割り当てます。たとえば、[Cases from Get High Priority Cases (優先度高のケースを取得 ケース)] コレクションに 15 件のケースが含まれている場合、15 という値が caseCount 変数に割り当てられます。
- Value (値): Cases from Get High Priority Cases (優先度高のケースを取得 ケース)
- [Assignment (割り当て)] 要素の後に、[Create Records (レコードを作成)] 要素を追加します。
- Label (表示ラベル):
Create Archived Metric(アーカイブ済みメトリクスを作成) - API Name (API 参照名):
Create_Archived_Metric - How to set record field values (レコードの項目値の設定方法): Manually (手動)
- Object (オブジェクト): Archived Metric (アーカイブ済みメトリクス)
- Field (項目): Value (値)
- Value (値): caseCount
- フローを保存します。[Flow Label (フローの表示ラベル)] に、
Daily High Priority Cases(毎日の優先度高のケース) と入力します。
有効にした後、フローはスケジュールした頻度に従って実行されます。残念ながら、フローはタイムマシンではありません。フローの開始時刻を過去にスケジュールしても、日時を遡って実行することはできません。最初の実行は、スケジュールされた頻度に従って行われます。たとえば、フローを毎週火曜日に実行されるよう設定し、水曜日に有効にした場合、フローの最初の実行日は次の火曜日になります。
$Record グローバル変数で複数レコードを更新する
レコードトリガーフローでは、$Record グローバル変数を使用して、フローをトリガーしたレコードにアクセスしたり更新したりできます。$Record はスケジュールトリガーフローでも使用できます。では、スケジュールトリガーフローで $Record が指すのはどのレコードでしょうか?
スケジュールトリガーフローでは、$Record グローバル変数は実際には複数のレコードを指します。スケジュールトリガーフローの開始要素を選択すると、[Choose Object (オブジェクトを選択)] をクリックし、Salesforce オブジェクトを選択して条件を定義することができます。

フローを実行すると、そのオブジェクトのレコードの中から条件に一致するものが検索され、$Record を通じて利用可能になります。オブジェクトと条件を設定しない場合、$Record は利用できません。
この条件は、1 つのオブジェクトのみを対象として該当するレコードを見つけ、それらすべてに対して同じアクションを実行するため、フローはレコードをバッチと呼ばれる大きな単位にまとめて処理することができます。Salesforce では、単一レコードを順に処理するよりもバッチ処理のほうが効率的であるため、通常はより高速で、ガバナ制限を超える可能性も低くなります。

レコードのバッチをバナナにたとえて考えてみましょう。バナナは、扱うときは複数本をまとめた束として扱われます。栽培も収穫も束単位で行われ、輸送も束のまま行われ、店舗でも束で販売されています。バナナを束で扱うことで、作業がすべてシンプルかつ迅速になります。バッチ処理も、Salesforce レコードに対して同じことを実現します。
スケジュールトリガーフローで $Record を使用する
自動起動フローの開始要素で条件を設定すると、2 つの変更が起こります。
- フローのすべての要素で、$Record がグローバル変数として利用可能になります。
- [Update Records (レコードを更新)] 要素の [How to Find Records to Update and Set Their Values (更新するレコードを検索してその値を設定する方法)] に 2 つの新しいオプションが表示されます。
-
Use the $Record global variable ($Record グローバル変数を使用): このオプションを使用すると、開始条件に一致するすべてのレコードを 1 つのバッチで更新できます。
-
Update records related to the record that triggered the flow (フローをトリガーしたレコードに関連するレコードを更新): このオプションを使用すると、1 つの関連オブジェクトのすべての子レコード (トリガー取引先に関連するすべての取引先責任者) を更新できます。
![上記の説明に対応する [How to Find Records to Update and Set Their Values (更新するレコードを検索してその値を設定する方法)] 設定](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/autolaunched-scheduled-flows/schedule-a-flow/images/ja-JP/61110d4c41b018671660ddd9e97cc246_kix.fjyyl7rnhsws.png)
最近、Pyroclastic の複数チームの従業員が、取引先責任者が存在しない取引先を多数見つけています。営業リーダーはこの問題に対処したいと考えていますが、注意が必要な取引先を効率的に特定する方法がありません。Flo から、毎週実行され、取引先責任者がいない取引先についてマネージャーに通知する Chatter 投稿を行うスケジュールトリガーフローを作成するよう依頼されました。
スケジュールトリガーフローを構築する
- スケジュールトリガーフローを作成します。
- スケジュールを設定します。
- Start Date (開始日): 明日の日付
- Start Time (開始時刻): 現在の時刻
- 頻度: 毎週
-
[Choose Object (オブジェクトを選択)] をクリックします。
- [Object (オブジェクト)] で [Account (取引先)] を選択します。
- [Condition Requirements (条件の要件)] で [None—Run Flow For All Accounts (なし — すべての取引先のフローを実行)] を選択します。
- [Get Records (レコードを取得)] 要素を追加します。
- Label (表示ラベル):
Find Contacts(取引先責任者を検索) - API Name (API 参照名):
Find_Contacts - Object (オブジェクト): Contact (取引先責任者)
- 条件の要件: [すべての条件に一致 (AND)]
- 条件レコードを絞り込み
- Field (項目): Account ID (取引先 ID)
- Operator (演算子): Equals (次の文字列と一致する)
- Value (値): Triggering Account (トリガー取引先) > Account ID (取引先 ID)
- Field (項目): Account ID (取引先 ID)
- 保存するレコード数: 最初のレコードのみ
- レコードデータの保存方法: すべての項目を自動的に保存
- [Get Records (レコードを取得)] 要素の後に、[Decision (決定)] 要素を追加します。
- Label (表示ラベル):
Contact Found?(取引先責任者が見つかったか?) - API Name (API 参照名):
Contact_Found - 結果を定義します。
- Label (表示ラベル):
Yes(はい) - Outcome API Name (結果の API 参照名):
Yes(はい) - Condition Requirements to Execute Outcome (結果を実行する条件の要件): All Conditions Are Met (AND) (すべての条件に一致 (AND))
- Resource (リソース):Contact from Find Contacts (取引先責任者を検索 取引先責任者) > Entire Resource (リソース全体)
- Operator (演算子): null
- Value (値): False ([Global Contacts (グローバル定数)] セクション内)
- Label (表示ラベル):
- デフォルトの結果の表示ラベルを
Noに変更します。
- Label (表示ラベル):
- テキストテンプレートリソースを作成します。
- API Name (API 参照名):
ChatterBody -
[View as Rich Text (リッチテキストとして表示)] を [View as Plain Text (プレーンテキストとして表示)] に変更します。
- 本文:
@[{!$Record.Owner.ManagerId}] This account has no contacts. Owner: @[{!$Record.OwnerId}]
- [No (いいえ)] パスに、[Action (アクション)] 要素を追加します。
- アクション: Chatter に投稿
- Label (表示ラベル):
Chatter Post to Manager(マネージャーへの Chatter 投稿) - API Name (API 参照名):
Chatter_Post_to_Manager - Message (メッセージ): ChatterBody
- Target Name or ID (対象名または ID): [Triggering Account (トリガー取引先)] > [Account ID (取引先 ID)]
- フローを保存します。[Flow Label (フローの表示ラベル)] に、
Weekly Check for Contacts(毎週の取引先責任者のチェック) と入力します。
リソース
- Salesforce ヘルプ: Schedule Triggers for Flows That Run for Batches of Records (レコードのバッチに対して実行されるフローのスケジュールトリガー)
- Salesforce ヘルプ: Schedule-Triggered Flow Considerations (スケジュールトリガーフローに関する考慮事項)
