dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

Force.com移行ツールで「選択リスト」項目を追加したら編集不可になった

大した話ではないんですが、はまってしまったのでメモ。

タイトルの通り、ある標準オブジェクト(今回は「商談(Opportunity)」に選択リストを追加しようとして
移行ツールから実行すると

項目は表示されるが、選択リストが「参照のみ」になっており、値を選択できない

という現象が発生しました。

選択リスト項目を.objectファイルに追加する

まず、Opportunity.objectにカスタム項目として選択リストを追記し、deployします。
ただ、xmlでどうやって書いていいかわからない...という場合。
一度Salesforceで選択リストを作成して、retrieveしましょう。

カスタム項目を追加した商談(Opportunity)をretrieveする

次のようなカスタム項目「Picklist1__c」を作成したとしましょう。

f:id:dackdive:20140510223321p:plain

package.xmlに以下を追記しましょう。

<types>
    <members>Opportunity</members>
    <name>CustomObject</name>
</types>

あるいは、項目を指定して次のような書き方でもいいでしょう。

<types>
    <members>Opportunity.Picklist1__c</members>
    <name>CustomField</name>
</types>

(このへんはForce.com移行ツールガイド を参照)

そしてretrieve用のコマンドを実行します。
build.xmlは以下のようになっているとします。
(Force.com移行ツールのデフォルトのとほぼ同じです)

<target name="retrieveUnpackaged">
  <mkdir dir="retrieveUnpackaged"/>
  <!-- Retrieve the contents into another directory -->
  <sf:retrieve username="${sf.username}" password="${sf.password}" serverurl="${sf.serverurl}" maxPoll="${sf.maxPoll}" retrieveTarget="retrieveUnpackaged" unpackaged="root/package.xml"/>
</target>

この場合のコマンドは

ant retrieveUnpackaged

すると、retrieveUnpackaged/objectsディレクトリ以下にOpportunity.objectが作成されるはず。
中身を見てみます。

Opportunity.object(抜粋)

<fields>
    <fullName>Picklist1__c</fullName>
    <externalId>false</externalId>
    <label>選択リストその1</label>
    <picklist>
        <picklistValues>
            <fullName>A</fullName>
            <default>true</default>
        </picklistValues>
        <picklistValues>
            <fullName>B</fullName>
            <default>false</default>
        </picklistValues>
        <picklistValues>
            <fullName>C</fullName>
            <default>false</default>
        </picklistValues>
        <sorted>false</sorted>
    </picklist>
    <trackFeedHistory>false</trackFeedHistory>
    <trackTrending>false</trackTrending>
    <type>Picklist</type>
</fields>

この書き方をそのまま真似すればよいことがわかります。

Opportunity.objectに選択リストを追加し、deployする

さて、先ほどの手順でOpportunity.objectへの記述方法がわかったので、
新しく選択リスト(今度は「Picklist2__c」)を作成し、deployします。

<fields>
    <fullName>Picklist2__c</fullName>
    <externalId>false</externalId>
    <label>選択リストその2</label>
    <picklist>
        <picklistValues>
            <fullName>1</fullName>
            <default>true</default>
        </picklistValues>
        <picklistValues>
            <fullName>2</fullName>
            <default>false</default>
        </picklistValues>
        <picklistValues>
            <fullName>3</fullName>
            <default>false</default>
        </picklistValues>
        <sorted>false</sorted>
    </picklist>
    <trackFeedHistory>false</trackFeedHistory>
    <trackTrending>false</trackTrending>
    <type>Picklist</type>
</fields>

deployを実行すると...

f:id:dackdive:20140510224326p:plain

追加されました。

ページレイアウトに追加し、表示してみるが...

追加した項目は、そのままではどのページレイアウトにも表示されていないため
ページレイアウトに追加します。

加えて、項目レベルセキュリティの設定も忘れずに。

f:id:dackdive:20140510224630p:plain

ここまで設定して、新規商談作成画面を開くと...

f:id:dackdive:20140510224856p:plain

あれ?編集できない...

原因はレコードタイプ

こっからしばらく悩んだんですが、
今回の場合、deployする前に商談にレコードタイプが作成されていたことが原因でした。

選択リストなどのいくつかの項目は、レコードタイプ別に
選択できる値を設定できますね。

で、問題になっている「Picklist2__c」の設定を見ると...

f:id:dackdive:20140510225443p:plain

あ...

値が何も選択されてない...

で、「選択済みの値」の方に選択リストの値を追加したら
無事編集できるようになりました。

そっかー...
でも、値が1個もないからって参照のみ項目みたいに表示しなくてもいいじゃない...

おわりに

わかったこと

Force.com移行ツールを使って、カスタム項目を追加することは可能。
ただし、ページレイアウトへの項目の追加、レコードタイプへの値の追加はできないので注意すること。

わからないこと

移行ツールで項目を追加する時、レコードタイプごとの設定とかできるんでしょうか?
でもそれだと組織依存になっちゃうのか。