2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめに

Salesforeのスケジュールフローで設定できる頻度は現在

  • 特定の日時に1回

特定の時間に

  • 毎日
  • 毎週

実行ができるのみとなっています。

これを、1日に数回起動したいとなると解決策としてはApexスケジューラーでの実装になるかとおもいます。
今回は、Apexスケジューラーでフローを起動してみます。

フローをやめて
Database.Batchable のApex一括処理バッチ + Apexスケジューラーで実装でもいいかもですが、
今回は、Apexとフローを作成する人が別の場合に使えるかもな?と思い記事を書いています。

今回やること

Apexスケジューラーで、Flow.Interviewでフローを起動し成功することを確認すること

実行用のフローを作成

Apexからの呼び出しになるので、自動起動フローを作成します。
作成するフローは、取引先レコードを作成するものです。

Apexの作成

BatchFlowInterviewAction.cls
/* flowを定期実行するクラス
 * 開発者コンソールから以下のように設定する
 * Map<String, Object> inputs = new Map<String, Object>();
 * BatchFlowInterviewAction batch = new BatchFlowInterviewAction('flowTest', inputs);
 * System.schedule('毎時0分に実行 取引先作成','0 0 * * * ?', batch);
 */
public with sharing class BatchFlowInterviewAction implements Schedulable {
  public String flowName;
  public Map<String, Object> inputs;
  public BatchFlowInterviewAction(String flowName, Map<String, Object> inputs) {
    this.flowName = flowName;
    this.inputs = inputs;
  }

  public void execute(SchedulableContext ctx) {
    Flow.Interview flow = Flow.Interview.createInterview(
      this.flowName,
      this.inputs
    );
    flow.start();
  }
}

実行の仕方はこんな感じ

開発者コンソール
Map<String, Object> inputs = new Map<String, Object>();
BatchFlowInterviewAction batch = new BatchFlowInterviewAction('flowTest', inputs);
System.schedule('毎時0分に実行 取引先作成','0 0 * * * ?', batch);

createInterview(flowName, inputVariables)

自動起動フローのAPI参照名をflowNameに渡す。
今回は利用していないが、inputVariablesに値を渡すことでフローの入力可能な変数に値をセットすることもできる

  public void execute(SchedulableContext ctx) {
+    Flow.Interview flow = Flow.Interview.createInterview(
+      this.flowName,
+      this.inputs
+    );
+    flow.start();
  }

開発者コンソールで登録

Apexスケジューラーを登録する方法は、開発者コンソールやsfdx等あるが今回は
開発者コンソールを使う

設定>開発者コンソールを起動

Debug>Open Execute Anonymous Windowを開く

以下のコードを貼り付けて実行

開発者コンソール
Map<String, Object> inputs = new Map<String, Object>();
BatchFlowInterviewAction batch = new BatchFlowInterviewAction('flowTest', inputs);
System.schedule('毎時0分に実行 取引先作成','0 0 * * * ?', batch);

実行確認

スケジュールが登録されているか確認

設定>スケジュール済みジョブから確認できます。

スケジュール済みジョブ-Salesforce

結果

データが生成されていました。

設定>Apexジョブ

Apexジョブで状況がキューのままになる??

仕様により、スケジュール済みの Apex ジョブは、ジョブの次回実行分がなくなるまで、常に [Queued] ステータスのままになります。次に、完了とマークされます。

とのことのなので
成功したか?失敗したか?どちらも知りたい場合は、ログ用のカスタムオブジェクトに入れる等必要そうだ。

スケジュール削除

設定>スケジュール済みジョブで該当のジョブを削除

スケジュール済みジョブ-Salesforce

さいごに

Apexスケジューラーを使って自動起動フローを1日に何回も起動することができました。
Apexジョブが新規で作られる訳ではなく、キュー→完了→キュー となるのは少し気持ち悪いですが
ログ系のオブジェクトに入れるとかエラーになったらメール通知する等で対応しようねてことでしょう。
今回はApexスケジューラーでしたが、Flow.Interviewでフローを実行できることがわかったので
フロー自体のテストをFlow.Interviewで書くのありですね。
フローにもテストを作る機能はありますが、全部補えるわけではないのでApexでテスト書くのありな気がしました。

参考にさせたいただいた記事

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?