2013-12-08

Force.com : オブジェクトにカスタム項目を大量に追加したい


この記事は Force.com Advend Calender 2013 8日目の記事です。



オブジェクトにカスタム項目を大量に追加したい

めんどい。
細かいこと(ユニーク制約、必須項目、ヘルプテキスト等)は画面で行うとして、ある程度タグを作成して .object ファイルにぺりっと貼って保存してしまえば OK な感じにしておく。



◇ 用意するもの

  • CommonLisp 系処理
※ xyzzy-lisp で動いたので大概動く気がします



◆ .object

■ テキスト
<fields>
    <fullName>API参照名</fullName>
    <externalId>false</externalId>
    <label>ラベル</label>
    <length>100</length>
    <required>false</required>
    <trackFeedHistory>false</trackFeedHistory>
    <type>Text</type>
    <unique>false</unique>
</fields>

■ テキストエリア
<fields>
    <fullName>API参照名</fullName>
    <externalId>false</externalId>
    <label>ラベル</label>
    <required>false</required>
    <trackFeedHistory>false</trackFeedHistory>
    <type>TextArea</type>
</fields>

■ チェックボックス
<fields>
    <fullName>API参照名</fullName>
    <defaultValue>false</defaultValue>
    <externalId>false</externalId>
    <label>ラベル</label>
    <trackFeedHistory>false</trackFeedHistory>
    <type>Checkbox</type>
</fields>

■ 選択リスト
<fields>
    <fullName>API参照名</fullName>
    <externalId>false</externalId>
    <label>ラベル</label>
    <picklist>
        <picklistValues>
            <fullName>選択肢1</fullName>
            <default>false</default>
        </picklistValues>
        <picklistValues>
            <fullName>選択肢2</fullName>
            <default>false</default>
        </picklistValues>
        <sorted>false</sorted>
    </picklist>
    <trackFeedHistory>false</trackFeedHistory>
    <type>Picklist</type>
</fields>



◆ 実装

■ ファイル(カンマ区切り)
type ラベル API参照名 その他 その他
Text ラベル API参照名(__cを除く) 文字数
TextArea ラベル API参照名(__cを除く)
Checkbox ラベル API参照名(__cを除く)
Picklist ラベル API参照名(__cを除く) 選択肢1 選択肢2
ex.)
Checkbox,有効,Isvalid
Text,名前,Name,255
Picklist,性別,Sex,男性,女性
TextArea,備考,Note

■ プログラム
(defun split(str)
  (let ((retval) (spf 0) (spe 0))
    (loop
      (setq spe (position #\comma str :start spf))
      (cond (spe (setq retval (cons (subseq str spf spe) retval)))
            (t
             (setq retval (cons (subseq str spf) retval))
             (return (reverse retval))))
      (setq spf (1+ spe)))))



(with-open-file (in "C:\\test.txt" :direction :input)
  (let ((line) (sp))
    (while (setq line (read-line in nil))
      (setq sp (split line))
      (cond ((equalp (nth 0 sp) "Text")
         (format t "
<fields>
    <fullName>~A__c</fullName>
    <externalId>false</externalId>
    <label>~A</label>
    <length>~A</length>
    <required>false</required>
    <trackFeedHistory>false</trackFeedHistory>
    <type>Text</type>
    <unique>false</unique>
</fields>"
             (nth 2 sp)  (nth 1 sp)  (nth 3 sp)))
        ((equalp (nth 0 sp) "TextArea")
         (format t "
<fields>
    <fullName>~A__c</fullName>
    <externalId>false</externalId>
    <label>~A</label>
    <required>false</required>
    <trackFeedHistory>false</trackFeedHistory>
    <type>TextArea</type>
</fields>"
             (nth 2 sp)  (nth 1 sp)))
        ((equalp (nth 0 sp) "Checkbox")
         (format t "
<fields>
    <fullName>~A__c</fullName>
    <externalId>false</externalId>
    <label>~A</label>
    <trackFeedHistory>false</trackFeedHistory>
    <type>Checkbox</type>
</fields>"
             (nth 2 sp)  (nth 1 sp)))
        ((equalp (nth 0 sp) "Picklist")
         (format t "
<fields>
    <fullName>~A__c</fullName>
    <externalId>false</externalId>
    <label>~A</label>
    <picklist>
~{        <picklistValues>
            <fullName>~A</fullName>
            <default>false</default>
        </picklistValues>~%~}        <sorted>false</sorted>
    </picklist>
    <trackFeedHistory>false</trackFeedHistory>
    <type>Picklist</type>
</fields>"
             (nth 2 sp)  (nth 1 sp) (member (nth 3 sp) sp))
         )))))