こんにちは、アンダーソンです。
今回は、MetadataAPIを使ってSalesforceのリストビューを取得して、
その後条件を変更するという事をやってみました。
なぜそんな事を?
今回お客様から、商談のフェーズを一つ廃止して、別の値に変えたいという要件が飛び込んできました。
そこでまず調査として、フェーズのその値がどこで使われているかを調べるためにMetadataからリストビューを取得した事から始まりました。
まず取得
リストビューのMetadataはカスタムオブジェクトの中に入っています。
今回使用したエディタはVSCodeです。
まず下記のようにpackage.xmlを変更します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Opportunity</members>
<name>CustomObject</name>
</types>
<version>50.0</version>
</Package>
でソース取得のコマンドを実行します。
sfdx force:source:retrieve --manifest ./manifest/package.xml
これでObjectフォルダが作成されますのでその中のOpportunityを開きます。
中に入ってるのは次のフォルダになります。
- businessProcesses
- fields
- listViews
- recordTypes
- webLinks
プラスOpportunity.object-meta.xmlが用意されます。
この中のlistViewsを開くと組織のリストビューをメタデータとして見ることができます。形式としては下記のような感じです。
<?xml version="1.0" encoding="UTF-8"?>
<ListView xmlns="http://soap.sforce.com/2006/04/metadata">
<fullName>ClosingThisMonth</fullName>
<booleanFilter>1 OR 2</booleanFilter>
<columns>OPPORTUNITY.NAME</columns>
<columns>ACCOUNT.NAME</columns>
<columns>OPPORTUNITY.AMOUNT</columns>
<columns>OPPORTUNITY.CLOSE_DATE</columns>
<columns>OPPORTUNITY.STAGE_NAME</columns>
<columns>CORE.USERS.ALIAS</columns>
<filterScope>Everything</filterScope>
<filters>
<field>OPPORTUNITY.CLOSED</field>
<operation>equals</operation>
<value>0</value>
</filters>
<filters>
<field>OPPORTUNITY.CLOSE_DATE</field>
<operation>equals</operation>
<value>THIS_MONTH</value>
</filters>
<label>今月クローズ</label>
</ListView>
それぞれの属性を残しておくと
属性 | 説明 |
fullName | リストビューのAPI名 |
booleanFilter | 条件ロジックの内容 |
columns | 表示させてるカラム。標準項目の時はOPPORTUNITY.ってなってるので要注意 |
filterScope | 私の〇〇とか全ての〇〇のところ。Everythingとかmineとかになる |
filters | 検索条件。複数ある場合はその数分属性がある |
field | 検索条件に使われる項目名 |
operation | 検索条件の条件(?)。一致する、含むとかのやつ。詳しくはここで |
value | 検索の値 |
label | リストビューのリスト名 |
とりあえずこれで取得して、filtersのところにフェーズの廃止する値を含んでないかをGrep検索かけて探しました。
一気にデプロイもしちゃえる
Grep検索かけて探してふとおもいました。
置き換えてデプロイしたら変わるんでは。。
そうです。変更できるんです。
でことで先程のビューを変更してみましょう。
二つ目の条件のTHIS_MONTHをLAST_MONTHに変更して、
1 OR 2の条件を消して全部にします。
できたファイルが下記のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<ListView xmlns="http://soap.sforce.com/2006/04/metadata">
<fullName>ClosingThisMonth</fullName>
<columns>OPPORTUNITY.NAME</columns>
<columns>ACCOUNT.NAME</columns>
<columns>OPPORTUNITY.AMOUNT</columns>
<columns>OPPORTUNITY.CLOSE_DATE</columns>
<columns>OPPORTUNITY.STAGE_NAME</columns>
<columns>CORE.USERS.ALIAS</columns>
<filterScope>Everything</filterScope>
<filters>
<field>OPPORTUNITY.CLOSED</field>
<operation>equals</operation>
<value>0</value>
</filters>
<filters>
<field>OPPORTUNITY.CLOSE_DATE</field>
<operation>equals</operation>
<value>LAST_MONTH</value>
</filters>
<label>今月クローズ</label>
</ListView>
で実行します。
sfdx force:source:deploy --sourcepath ./force-app/main/default//objects/Opportunity/listViews/ClosingThisMonth.listView-meta.xml
するとこんなリストビューだったのが。。。

うまく条件が変更されましたね。

上手く使えば効率よく変更できそうです。
まとめ
MetadataAPIは正直かなりややこしいですね笑
ListViewのMetadataAPIのページがあるからとずっとname属性にListViewを入れてたんですが、まさかの商談オブジェクト内にあるとは。。。
でも操れるようになるとかなり時間効率をあげられると思いました。
引き続き勉強していきたいと思います!