はじめに
リストビューで行をいくつか選び、ボタンを押して画面フローを開きたい。LWC は書きたくない。よくある要件です。ところが、次のところで詰まりがちです。
- カスタムボタンを作ったのに、リストビューにボタンが出ない(商品 Product2 だと特に「足せない」という質問を見かけます)
- 選んだレコードの Id をフローに渡そうとして URL に
GETRECORDIDSを書いたら、フローに変な文字が混ざる
この記事では、商品(Product2)と取引先で、ボタンを作る → リストビューに出す → 行を2つ選んで押す → フローの変数に Id が2つ入る、までを確かめた結果をまとめます。
対象読者
- リストビューから画面フローを開くボタンを作りたい管理者
- 「ボタンを作ったのにリストビューに出ない」と困っている方
検証の環境
Developer Edition から作ったスクラッチ org に、Salesforce CLI でメタデータを反映して確かめました。リストビューに出たかは UI API(/ui-api/actions/list-view/<リストビューId>)で、押したあとの画面は見えないブラウザで行を選んで押して確かめています。Claude Code を道具に使い、「出るはず」「出ないはず」を先に書いてから結果と突き合わせました。
結論
| # | やること | 落とすと |
|---|---|---|
| 1 | リストボタン(WebLink)を URL 型・massActionButton・行の選択必須 で作り、URL は /flow/<フロー名>
|
— |
| 2 | URL 型のボタンには encodingKey(UTF-8) を入れる(メタデータで作るとき) |
反映が encodingKey must be specified で失敗 |
| 3 | オブジェクトの 検索レイアウトの「リストビュー」 にボタンを足す | ボタンを作っても リストビューに出ない |
| 4 | フローに 入力用のテキストのコレクション変数 ids を作る |
選んだ Id を受け取れない |
| 5 | URL に ids を 書かない
|
ids に余計な文字が混ざる |
商品(Product2)でも取引先でも、結果は同じでした。Product2 だけ足せない、ということはありませんでした。
手順
1. 画面フロー: 入力用の ids を用意する
<variables>
<name>ids</name>
<dataType>String</dataType>
<isCollection>true</isCollection>
<isInput>true</isInput>
<isOutput>false</isOutput>
</variables>
名前は ids そのものにします。今回のフローは、受け取った ids を画面に出すだけにしました(実務では、これで Get Records して更新などに進みます)。
2. リストボタン(WebLink)
<WebLink xmlns="http://soap.sforce.com/2006/04/metadata">
<fullName>Flow_Button</fullName>
<availability>online</availability>
<displayType>massActionButton</displayType>
<encodingKey>UTF-8</encodingKey>
<linkType>url</linkType>
<masterLabel>フローを開く</masterLabel>
<openType>replace</openType>
<protected>false</protected>
<requireRowSelection>true</requireRowSelection>
<url>/flow/My_List_Flow?retURL=/lightning/o/Product2/list</url>
</WebLink>
- 最初に
encodingKeyを付けずに反映したら、Product2 も取引先もencodingKey must be specifiedで失敗しました。画面で作るときは既定で入るので、メタデータで書くときだけの落とし穴です -
linkTypeをflowにした WebLink はYou can't create weblink of type flowで作れませんでした。URL 型で/flow/<フロー名>を開きます -
displayTypeをbutton(行を選ばなくても押せる型)にしても、検索レイアウトに足せば出ました。UI API では mass の型がisMassAction=true、buttonがfalseでした
3. 検索レイアウトの「リストビュー」に足す(ここが本題)
ボタンを作っただけでは、リストビューに出ません。 オブジェクトの検索レイアウトの「リストビュー」(List View)にボタンの名前を足して、はじめて出ました。
メタデータでは、検索レイアウトは独立した型ではなく、オブジェクト(CustomObject)の中の searchLayouts です。-m "SearchLayouts:..." で取り出そうとすると Missing metadata type definition になります。
sf project retrieve start -m CustomObject:Product2
取り出したファイルの searchLayouts に足します。
<searchLayouts>
<listViewButtons>Flow_Button</listViewButtons>
<!-- もとからある customTabListAdditionalFields などはそのまま -->
</searchLayouts>
オブジェクトのファイルごと反映することになるので、取り出した最新のファイルに足して 反映します(古い手元のファイルで上書きしないため)。画面なら、オブジェクトマネージャー → 対象のオブジェクト → 検索レイアウトの「リストビュー」です(この画面の見え方は、今回は確かめていません)。
確かめ方: UI API でリストビューのボタンの一覧を見ました。
sf api request rest "/services/data/v62.0/ui-api/actions/list-view/<リストビューId>"
| 状態 | 一覧にボタンが |
|---|---|
| WebLink だけ作った | 出ない |
listViewButtons に足した |
出た(Product2 も取引先も) |
listViewButtons から外した |
消えた |
| 足し直した | また出た |
URL にオブジェクト名を入れる形(.../list-view/Product2/...)にすると ENTITY_NOT_QUERYABLE になりました。リストビューの Id だけを入れます。
4. 押して確かめる
リストビューで行を2つ選んでボタンを押すと、フローが開き、ids に 選んだ2件の Id(Product2 なら 01t…、取引先なら 001…)が入りました。
つまずき: URL に ids を書くと、余計な文字が混ざる
古い記事を見ると、URL に GETRECORDIDS で Id を渡す書き方があります。試しに次のように書きました。
/flow/My_List_Flow?ids={!GETRECORDIDS($ObjectType.Product2)}&retURL=/lightning/o/Product2/list
結果、ids には getRecordIds('01t') という文字が2つと、選んだ Id が2つ 入りました。Lightning のリストビューでは、選んだ Id は書かなくても ids に渡されます。書くと、置き換わらない文字がそのまま混ざります。フローで Get Records すると、この文字が Id として不正なので、あとの処理で困ります。
確かめていないこと
- 押したあと、フローを終えたときに
retURLへ戻るか - フロー型のクイックアクションをリストビューに出す方法(別の道として紹介されることがあります)
- Experience Cloud のサイトのリストビュー
- 「Product2 だけ足せない」と言っている方の本当の原因(今回の組織では再現しませんでした。検索レイアウトに足していない、を最初に疑うのがよさそうです)
まとめ
- リストビューのボタンは、作る(WebLink)と 出す(検索レイアウトの「リストビュー」)の2段。出ないときは、まず検索レイアウトを見る
- メタデータで書くなら、URL 型のボタンに
encodingKey、検索レイアウトはCustomObjectの中のsearchLayouts - 画面フローは
/flow/<フロー名>を開き、選んだ Id は入力用のテキストのコレクション変数idsで受ける。URL にidsは書かない - 出たかどうかは、UI API の
/ui-api/actions/list-view/<リストビューId>で、画面を開かずに確かめられる
筆者は Salesforce の設定の代行・相談を受けています(連絡先は Qiita のプロフィールに)。
参考
- Metadata API Developer Guide「WebLink」(
encodingKeyは必須・既定 UTF-8、requireRowSelectionはmassActionButtonのときだけ) https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_weblink.htm - Metadata API Developer Guide「SearchLayouts」(親の CustomObject からだけ読み書きできる。
listViewButtonsは Setup の検索レイアウトの「Buttons Displayed」に当たる) https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_searchlayouts.htm
筆者は Salesforce の設定の代行・相談を受けています(連絡先は Qiita のプロフィールに)。