#はじめに
force cliを使ってカスタムオブジェクトにカスタムフィールドを追加します。
ただし、picklistの場合にうまくいかなかった。
そこでforce cliを少し改造しました。その時の備忘録です。
#変更前の挙動
picklist型の項目を追加するコマンドの例
$force field create CustomObject__c "CustomField":picklist picklist:"1,2" label:区分
実行結果の例
Options: map[label:区分 picklist>picklistValues:1,2]
Key label
Options: map[picklist>picklistValues:1,2 label:区分]
Key picklist>picklistValues
ERROR: Property 'picklist' not valid in version 40.0
とversion 40.0ではpicklistは使えないと出てきます。
#エラーの中身は?
https://developer.salesforce.com/docs/atlas.ja-jp.api_meta.meta/api_meta/meta_picklist.htm
を見てみると この型は、API バージョン 37.0 以前でのみ使用します。
となっています。どうもversion 40.0では異なっているようです。
そこで、既にpicklistを指定しているカスタムオブジェクトのmetaデータを確認します。
valueSetというタグに変わっているようです。
#変更内容
field createで実際にmeta データを作っているプログラムは
go/src/github.com/ForceCLI/force/lib/metadata.goにありますので確認。
ちょうど866行目あたりにありました。
この部分を改造すればなんとかなりそうです。
soapField += "<picklist>\n"を
soapField += "<valueSet>\n<restricted>true</restricted>\n<valueSetDefinition>\n"に変更。
soapField += fmt.Sprintf("<picklistValues>\n<fullName>%s</fullName>\n<default>false</default>\n</picklistValues>\n", strings.Trim(k, " "))を
soapField += fmt.Sprintf("<value>\n<fullName>%s</fullName>\n<default>false</default>\n<label>%s</label></value>\n", strings.Trim(k, " "), strings.Trim(k, " "))に変更。
soapField += "</picklis>\n"を
soapField += "</valueSetDefinition>\n</valueSet>\n"に変更。
以上3行を変更すればできそう。
実際に確認してみます。
force cliのmain.goがあるディレィトリーに移動して
$go run ./main.go field create CustomObject__c "CustomField":picklist picklist:"1,2" label:区分
を実行すれば、実際に動くかを確かめられます。(うまくいけば項目が追加されます)