本日のTips!は、リストビューで選択したレコードを引数にしてフローを実行する方法のご紹介となります。
なるべく標準機能を利用して、リスビューで選択したレコードに対して一括で処理したいという要件は多々あるかと思います。
昔はよくボタンとJavascriptを組み合わせて実現していましたが、今はフロー(Flow)が非常に使いやすく高機能になってきたため、カスタムボタン+Flowで実現することをお勧めしています。
ただし、今回ご紹介する方法は、完全に標準というわけではなく、一部Visualforceを利用します。
※セールスフォースのヘルプでも紹介されているやり方となります。
ポイント
- リストビューからフロー(Flow)を呼び出す方法
- Visualforce経由のフロー実行及びパラメータの受け渡し方法
1.リストビューで選択した取引先責任者を画面フロー(Flow)に表示してみよう
今回は、サンプルとして取引先責任者(Contact)を利用します。
取引先責任者は、リストビューで選択した取引先責任者に対してリストメール送信(一括で複数の取引先責任者へメールを送信)の機能が用意されていますが、そのほかの用途として、例えば、標準のアンケート(Survey)を顧客担当者へ一括で送信したいという場合に、今回ご紹介する機能を使えば実現することができます。
アンケートを複数の取引先に一度に送信する方法は別の記事でご紹介します。
簡単な流れ
- フロービルダー(Flow Builder)を新規作成
- フローを実行するVisuaforceの作成
- Visualforceを実行するカスタムボタンを作成
- カスタムボタンを取引先責任者へ表示する
- 処理を実行して、設定内容を検証する
では、一つ一つ手順の内容を解説していきたいと思います。
1.フロービルダー(Flow Builder)を新規作成
1.Salesforceにログインして、設定から[フロー]を検索して、フロー画面から、[新規フロー]ボタンをクリックします。
画像をクリックすると拡大できます。
2.続いて、画面フローを選択して、[次へ]ボタンをクリックします。
※リストビューで選択されたレコードを使って、フローの画面上で選択されたレコードを別の値に更新する処理を行います。
3.フロービルダー(Flow Builder)では、まずリストビューで選択された取引先責任者のレコードをフロー画面のパラメータとして受け取るための変数を定義します。[新規リソース]ボタンをクリックします。
4.新規リソース画面で、以下の内容を登録して、[完了]ボタンをクリックします。
参考
- リソース種別:変数
- API参照名:API名をアルファベットで入力
- 説明:変数の説明を入力
- データ型:レコード
- オブジェクト:取引先責任者(Contact)
- 複数の値を許可(コレクション):ON
- フロー外部での可用性:入力、出力ともにチェック
※今回はVisualforceからFlowに取引先責任者のレコードセットを入力パラメータとして引き渡すため、フロー外部での可用性の入力で使用可能にチェックしています。
5.次に画面を作成します。要素を追加から、画面を選択します。
6.画面を編集にて、以下の内容を設定します。
参考
- コンポーネント:表示テキスト
- API参照名:API名をアルファベットで入力
- テキストの内容:{!ContactRecordSet}
7.最終的に以下のような構成となります。
8.最後に保存ボタンをクリックして、名前を付けて保存して、有効化します。
2.フローを実行するVisualforceの作成
次にリストビューで選択した値をフローに引渡すVisualforceページを作成します。
1.Visualforceページから[新規]ボタンをクリックします。
2.Visualforceページにて、以下の内容を登録します。
/* 標準コントローラでContactを指定します。 */
<apex:page standardController="Contact" recordSetVar="Contact">
/* flow:interview:作成したフローのAPI参照名を指定
* finishLocation:最近参照した取引先責任者のリストビュー */
<flow:interview name="ShowSelectedContactList" finishLocation="{!URLFOR('/lightning/o/Contact/list?filterName=Recent')}">
/* param name:フローの中で作成した入力変数を指定します。
* value:"{!Selected}"を指定 ※リストビューの選択値を設定 */
<apex:param name="ContactRecordSet" value="{!Selected}"/>
</flow:interview>
</apex:page>
Salesforce.com Visualforce 開発者ガイド <flow:interview> を使用した高度な例
3.Visualforceを実行するカスタムボタンを作成
作成したVisualforceページを実行するカスタムボタンを作成します。
1.オブジェクトマネージャから取引先責任者を検索し、[ボタン、リンク、およびアクション]のメニューから「新規ボタンまたはリンク」ボタンをクリックします。
2.続いて、ボタンの内容を以下の通り設定します。
参考
- 表示ラベル:ボタンのラベル名を入力
- 名前:API名をアルファベットで入力
- 表示の種類:リストボタン ※チェックボックスの表示はどちらでもよい
- 動作:現在のウインドウにサイドバー付きで表示
- 内容のソース:URL
- 内容:以下の内容をセットしてください。
※Visualforceの標準コントローラ(StandardController)で取引先責任者(Contact)が設定されていないとコンテンツでは作成したVisualforceページが選択できないため、表示されていない場合はもう一度Visualforceが正しく作成されているか確認しましょう。
4.カスタムボタンを取引先責任者へ表示する
1.Salesforce Classicの検索レイアウトで、リストビューの▼ボタンから編集を実行します。
取引先責任者をリストビューでは、先ほど作成したカスタムボタンが利用可能となっているので、選択して保存します。
※標準ボタンが多いと表示されなくなるので、不要なチェックはすべて外しておきましょう。
正しく設定されると以下のようにボタンが表示されます。
5.処理を実行して、設定内容を検証する
1.取引先責任者のリストビューから複数の取引先責任者を選択して、[画面フロー起動]ボタンをクリックします。
2.選択された取引先責任者のレコードはVisualforceページ経由で画面フローへ引き渡され、画面フローのテキストで表示されることが確認できます。
以上で設定から検証まで完了となります。
(2023/02/17 Update)
取得したIDの一覧はこのままの状態では、フローの中で繰り返し処理を行ったりすることができません。
Apexコードに上記取得したIDの文字列を渡して、String型のリストに変換することで、繰り返し処理などを行うことができます。
Apexコードのサンプルは以下となります。
サンプルコード
/**--------------------------------------------------------------------------
プログラム名 CCLT_MultiSelectFlowIds
* 概 要 :セミコロン区切りのID文字列をフロー対応のリスト型にして返却する
* 作成日 :2023.02.17
* 作成者 :クリエイティブコンテンツラボトウキョウ
*--------------------------------------------------------------------------**/
public with sharing class CCLT_MultiSelectFlowIds {
@InvocableMethod(label='FlowのIDリストを指定' description='セミコロン区切りのID文字列をフロー対応のリスト型にして返却する')
public static List<List<String>> getIdList(List<String> ids) {
if(!(ids.isEmpty())){
string tempStr = ids[0];
List<String> lstnew = tempStr.split(';');
list<list<string>> finalLst = new list<list<string>>();
finalLst.add(lstnew);
return finalLst;
//IDリストが指定されていない場合NULLを返却
} else {
return null;
}
}
}
※こちらはテストクラスのサンプルです。
/**--------------------------------------------------------------------------
* プログラム名:CCLT_MultiSelectFlowIdsTest
* 概 要 CCLT_MultiSelectFlowIdsテストクラス
* 作成日 :2023.02.18
* 作成者 :クリエイティブコンテンツラボトウキョウ
* --------------------------------------------------------------------------**/
@isTest(SeeAllData=false)
public with sharing class CCLT_MultiSelectFlowIdsTest {
@isTest
public static void getIdList_case1() {
// 取引先を作成
Account acc1 = new Account(name='cclt');
insert acc1;
// 募集人を2名作成
List<Contact> conList = new List<Contact>();
conList.add(new Contact(FirstName='creative', Lastname='content',AccountId=acc1.id));
conList.add(new Contact(FirstName='lab', Lastname='tokyo',AccountId=acc1.id));
insert conList;
//String型のリストを生成
List<String> ids = New List<String>();
//取引先のIDをセミコロンで結合した文字列をStringリストに格納
ids.add(conList[0].id + ';' +conList[0].id);
//テスト開始
Test.startTest();
//セミコロンで結合したIDをIDのリスト型で返却するメソッドを実行
List<List<String>> listd = CCLT_MultiSelectFlowIds.getIdList(ids);
//リストのレコードが2件返却されればOK
system.assertEquals(2,listd[0].size());
//テスト終了
Test.stopTest();
}
/**
* メソッドに空文字列を渡した場合にNULLが返却されることを確認
*/
@isTest
public static void getIdList_case2() {
//文字列のリストを生成 ※値は設定しない
List<String> ids = New List<String>();
//テスト開始
Test.startTest();
List<List<String>> listd = CCLT_MultiSelectFlowIds.getIdList(ids);
//NULLが返却されればOK
system.assertEquals(null,listd);
//テスト終了
Test.stopTest();
}
}
まとめ
いかがでしたでしょうか。説明した手順で設定はうまくいきましたか。
今回は、画面フローで取引先責任者のIDを表示する方法をご紹介しましたが、実際に利用する場合は、このあと取得したレコード分繰り返し処理を行いい、更新用のレコード変数を作成したり、リストが未選択の場合のエラー処理や画面表示を追加するなど具体的なロジックを入れることになります。
それでは、また。