Salesforceの自動起動フローを1日に数回起動させたい

# はじめに

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

- 特定の日時に1回

特定の時間に
- 毎日
- 毎週

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

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

![](https://user-images.githubusercontent.com/39574826/208312377-6acf3a21-bb8a-46bf-b790-b1ab79773820.png)

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_scheduler.htm

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

# 今回やること

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

# 実行用のフローを作成

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

![](https://user-images.githubusercontent.com/39574826/208313622-efad5efe-bae6-46a4-b49e-bec798ac9fcc.png)

![](https://user-images.githubusercontent.com/39574826/208313551-39c2cb95-25be-44a8-9354-52a9364a1519.png)

![](https://user-images.githubusercontent.com/39574826/208313070-9a614753-699d-493e-80df-9863543b3073.png)

# 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();
  }
}
```

https://developer.salesforce.com/docs/atlas.ja-jp.212.0.apexcode.meta/apexcode/flow_interview_class.htm

実行の仕方はこんな感じ

```apex: 開発者コンソール
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`に値を渡すことでフローの入力可能な変数に値をセットすることもできる

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

# 開発者コンソールで登録

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

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

![](https://user-images.githubusercontent.com/39574826/208314163-b5392be3-852b-42ec-8dd6-23ea2e4a9186.png)

`Debug>Open Execute Anonymous Window`を開く

![](https://user-images.githubusercontent.com/39574826/208314220-91990339-c667-4b19-89ab-36b1a40628e0.png)

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

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

![](https://user-images.githubusercontent.com/39574826/208314266-20b202e8-1e80-45d3-9c47-644ab529a66d.png)

# 実行確認

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

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

![スケジュール済みジョブ-Salesforce](https://user-images.githubusercontent.com/39574826/208314327-dcfbf901-8cab-4bad-a68f-048895638213.png)

## 結果

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

![](https://user-images.githubusercontent.com/39574826/208322693-2349104d-1d4b-4105-9f54-4eda60f9c70a.png)

`設定>Apexジョブ`

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

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

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

![](https://user-images.githubusercontent.com/39574826/208322788-fc611604-0e67-4049-8643-771ab434ef75.png)

https://help.salesforce.com/s/articleView?id=000383866&type=1

## スケジュール削除

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

![スケジュール済みジョブ-Salesforce](https://user-images.githubusercontent.com/39574826/208314327-dcfbf901-8cab-4bad-a68f-048895638213.png)

# さいごに

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

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

https://developer.salesforce.com/docs/atlas.ja-jp.212.0.apexcode.meta/apexcode/flow_interview_class.htm

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_scheduler.htm

http://kayakuguri.github.io/blog/2015/06/11/apex-batch-schedule/