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)」も付ける例がたくさん出てきます。これはメソッドの結果をクライアント側にキャッシュすることでパフォーマンスが高まりますというものなのですが、メソッドの中で更新処理が走るものについてはつけられませんのでご注意ください。
おわります。