Salesforce

フロー承認プロセスをApexから起動する

投稿日:

SalesfoceのLWC開発について

フロー承認プロセスをオブジェクトのカスタムボタンから起動する方法は公式のリファレンスにもあるのですが、Apexから起動する方法はなかったので調べました。

自作のボタンからフロー承認プロセスを起動する

まずはオブジェクトのカスタムボタンから起動させるときのボタンの作成方法です。

https://help.salesforce.com/s/articleView?id=platform.automate_automated_approvals_deploy_create_button_for_autolaunched_approval_orchestration.htm&type=5

オブジェクトのカスタムボタンを作成するときは、URLをボタンに設定してあげる形になります。

/flow/Contract_Approval?recordId={!Contract.Id}&submitter={!$User.Id}&retURL={!Contract.Id} 

リファレンス上に書かれているURLはこれです。分解すると、
「/flow/Contract_Approval
これは作成したフローのAPI名を指定するところ。
recordId={!Contract.Id}」
submitter={!$User.Id}
retURL={!Contract.Id} 」
これはフローの引数に値を設定して、渡してあげるための記述です。
つまり、
引数「recordId」に値『{!Contract.Id}』を設定
引数「submitter」に値『{!$User.Id}』を設定
引数「retURL」に値『{!Contract.Id}』を設定
ですね。
もう少し言うと、この例では「Contract(契約)」オブジェクトにカスタムボタンを設定しているので、「Contract.Id」でオブジェクトIDを設定できています。

以下に画面に設置したボタンを押下して、フロー承認プロセスを起動するコードを書きます。
ここでいうボタンとは、オブジェクトのカスタムボタンではなく、lwcコードで作成するカスタムボタンです。
ちなみにコードは動作確認をしていないのでそのままコピーしても動かないかもしれませんのでご了承ください。

前提として、フロー承認プロセスの自動起動フローが以下のように作成されているとします。

フローAPI名:CustomFlowApproval

これだけなら、一般的なフローの呼び出しです。Mapで引数を用意して、フローに渡して起動します。

<template>
    <div>
        <lightning-button variant="brand" label="フロー承認プロセス起動" onclick={handleClick}>
        </lightning-button>
    </div>
</template>
import { LightningElement, api } from 'lwc';
// 作成したApexクラスをインポート
import startFlow from '@salesforce/apex/flowController.startFlowFromApex';


export default class flowButtom extends LightningElement {
    @api recordId;

    handleClick() {
        startFlow({ recordId: this.recordId })
            .then(() => {
                console.log('Flow started successfully');
            })
            .catch(error => {
                console.error('Error starting flow:', error);
            });
    }
}
public with sharing class flowController {
    @AuraEnabled
    public static void startFlowFromApex(String recordId) {
        // フローの入力変数をセット
        Map<String, Object> flowInputs = new Map<String, Object>();
        flowInputs.put('recordId', recordId);
        flowInputs.put('submitter', UserInfo.getUserId());
        flowInputs.put('retURL', recordId);

        // Flow.Interview クラスを使ってフローを起動
        Flow.Interview.CustomFlowApproval flow = new Flow.Interview.CustomFlowApproval(flowInputs);
        flow.start();
    }
}

シンプルな形でよければ以上です。

ついでに今回ハマってしまった部分を注意事項としてご紹介します。

注意1:フローでレコードを引数としている場合

Salesforceの画面キャプチャは用意できかったのでイメージしてください。

レコードページから操作する予定のフロー承認プロセスだったので、フロー側でレコードを受け取る変数を作成していました。

変数
リソース種別:変数
API参照名:Record
データ型:レコード
フロー外部での可用性:「入力で使用可能」にチェック

こいつに対して、フローを起動する側で値を渡してあげないといけません。

オブジェクトのボタンからフロー承認プロセスを起動するときはURLにレコードIDを追加すれば良いです。

/flow/Contract_Approval?recordId={!Contract.Id}&submitter={!$User.Id}&retURL={!Contract.Id} &Record={!Contract.Id}

公式リファレンスの例に追加する場合はこうです。最後にRecordにレコードIDを設定してあげるだけ。こうすると自動的にレコードIDに紐づくレコードを取得してくれました。

ただ、今回の記事で書いているようなApexからの呼び出しだとレコードIDから自動検索はしてくれないようです。自分でレコードを取得しないとダメ

public with sharing class flowController {
    @AuraEnabled
    public static void startFlowFromApex(String recordId) {
        // フローの入力変数をセット
        Map<String, Object> flowInputs = new Map<String, Object>();
        flowInputs.put('recordId', recordId);
        flowInputs.put('submitter', UserInfo.getUserId());
        flowInputs.put('retURL', recordId);

        // 必要な項目を取得してください。
        Contract record = [SELECT id FROM Contract WHERE id =: recordId];
        flowInputs.put('Record', record);

        // Flow.Interview クラスを使ってフローを起動
        Flow.Interview.CustomFlowApproval flow = new Flow.Interview.CustomFlowApproval(flowInputs);
        flow.start();
    }
}

注意2:cacheableは更新処理には不要

フロー承認プロセスに関する知識ではないのですが引っかかったので共有します。

ApexメソッドをJavascript側で呼び出せるようにするには「@AuraEnabled」というアノテーションをつけます。そのとき「(cacheable=true)」も付ける例がたくさん出てきます。これはメソッドの結果をクライアント側にキャッシュすることでパフォーマンスが高まりますというものなのですが、メソッドの中で更新処理が走るものについてはつけられませんのでご注意ください。

おわります。

-Salesforce

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

[Visualforce][jQuery]ID指定で要素を選択する

Visualforceでの開発にて、jQueryで要素を IDで指定したいのになかなかうまく取得できなくて苦しみました。 いやだいぶハマりましたが以下にて解決 フルパスの指定は出来なかった 状況を簡単 …

[LWC]エラー「System.LimitException: Too many DML statements: 1」

SalesforceのLWC開発について 下記エラーが発生した時の原因と対策 「System.LimitException: Too many DML statements: 1」 原因と対策 結論: …