Memos About Salesforce

Salesforceにハマってたこと!

Salesforce DataLoader バッチで自動的に【登録】抽出 更新

こんにちは、管理人の@Salesforce.Zです。

データのインポートとエクスポートは、データローダで手動操作だけではない、コマンドラインを使って実行することもできます。コマンドを使用して、データのインポートとエクスポートを自動化できます。

今回、データのインポートとエクスポートを自動的に行うため、

Dataloaderをどう使うかを共有します。

目次

インポート:Dataloderを自動的に動かすための設定

データローダコマンドライン機能を使ってデータをインポートする方法 次の手順に従います。

・ステップ 1: 暗号化鍵を作成する

・ステップ 2: ログインユーザ名の暗号化パスワードを作成する

・ステップ 3: 項目の対応付けファイルを作成する

・ステップ 4: インポート設定を含む process-conf.xml ファイルを作成する

・ステップ 5: プロセスを実行してデータをインポートする

暗号化鍵を作成する

データローダのバージョンによって、やり方は少し異なるので、分けて記載します。

Windowsコマンドプロンプトから暗号化キーを生成 (データローダ バージョン 42以前の場合)​

  1. データローダを保存するディレクトリへ移動します。   例:[cd C:\Program Files (x86)\salesforce.com\Data Loader\bin]

  2. 任意の文字列で暗号化キーを生成する  ※コマンド中の は任意の文字列に置き換えます   例:[encrypt.bat -g ]

  3. 出力された次のコンソールの *************** の部分をテキストファイルにコピーし、"key.txt" として保存します  ※このキーは次のステップでパスワードを暗号化する際に使用します。

  例:[security.EncryptionUtil main (EncryptionUtil.java:304) - ***************]

Windowsコマンドプロンプトから暗号化キーを生成 (データローダ バージョン 43の場合)

  1. データローダのインストールディレクトリへ移動します。

  例:[cd C:\Program Files (x86)\salesforce.com\Data Loader\bin]

  1. 暗号化キーファイルを生成します。コマンド中の は任意のディレクトリ、およびファイル名(拡張子は.keyとします)に置き換えます。の指定がない場合、 "C:\Users\<Windowsユーザ名>.dataloader\dataLoader.key" として暗号化キーファイルが生成されます。

 例:[encrypt.bat -k ]

しかし、僕は「-k」オプションで動作しませんでした。

「-e」オプションで動作しました。

f:id:jude2016:20190419161833p:plain
実行例

任意の場所にテキストファイルを用意し、生成した鍵を中にコピーし保存する 

この例の場合の鍵:赤枠内の内容

僕の場合はDataloaderのbinの下にkey.txtファイルを用意し中に生成した鍵を保存しました。

この鍵ファイルのフルパスを下記のファイル(config.properties)のprocess.encryptionKeyFileの値として書きます。

※このファイルは暗号化と復号化で使用するため、慎重に保存してください。

さらにDataloaderファイルに「sample」フォルダがインストール時にあるフォルダである、もしなければ、

Dataloaderフォルダの直下にbinフォルダと同じ階層に「conf」フォルダを用意し、中にconfig.propertiesファイルを作成し、内容を下記のようにすればいい

<config.propertiesの設定例>

# Data LodaerLoader Config
# https://help.salesforce.com/apex/HTViewHelpDoc?id=loader_params.htm

# 接続先情報
sfdc.endpoint=https://login.salesforce.com
sfdc.username=hogehoge@test
sfdc.password=暗号化パスワード//encrypt.bat -e sf_login_password "your key file path"のコマンドで生成した暗号化パスワード
process.encryptionKeyFile=C:\Users\<Windowsユーザ名>\.dataloader\dataLoader.key"/> //(データローダ バージョン 43 の場合)、encrypt.bat -e keytextってコマンドで生成した鍵を保存したファイルのパス

# データアクセス設定
dataAccess.type=databaseRead
dataAccess.readUTF8=false
dataAccess.writeUTF8=false
dataAccess.readBatchSize=2000
dataAccess.writeBatchSize=2000

# ログ出力設定
process.enableExtractStatusOutput=false
process.enableLastRunOutput=false
process.lastRunOutputDirectory=
process.statusOutputDirectory=
process.outputSuccess=
process.outputError=
sfdc.debugMessages=false

# プロキシ設定
sfdc.proxyHost=
sfdc.proxyNtlmDomain=
sfdc.proxyPassword=
sfdc.proxyPort=
sfdc.proxyUsername=

# その他の設定
sfdc.enableRetries=true
sfdc.extractionRequestSize=2000
sfdc.insertNulls=false
sfdc.loadBatchSize=1000
sfdc.maxRetries=3
sfdc.minRetrySleepSecs=2
sfdc.noCompression=false
sfdc.timeoutSecs=600
sfdc.timezone=GMT+09:00
sfdc.useBulkApi=true

※config.propertiesの「process.encryptionKeyFile」の値に上記の鍵をセットする

ログインユーザ名の暗号化パスワードを作成する

ここの設定もconfig.propertiesファイルに使います。

中には「sfdc.password=*暗号化パスワード」の部分があり、この部分を準備します。

このステップでは、前のステップで生成した鍵ファイルを使って、暗号化されたパスワードを作成します。

僕の場合、前のステップで生成した鍵ファイルをDataloaderのbinのフォルダの直下に保存しているので、コマンドで下記を入力します。

encrypt.bat -e sfdc_login_password "C:\Program Files (x86)\salesforce.com\Data Loader\conf\key.txt"

f:id:jude2016:20190419161648p:plain
実行例

暗号化したパスワードをconfig.propertiesファイルのsfdc.password=暗号化パスワード部分の暗号化パスワードに置換します。

項目の対応付けファイルを作成する

このステップでは、.sdl ファイル拡張子を使用して対応付けファイルを作成します。対応付けファイルの各ラインで、データの供給元と保存先のペアを作成します。

※この記事では、取引先を例に操作します。

テキストファイルに次をコピーし、accountInsertMap.sdl という名前で保存します。

これはデータの挿入であるため、

等号符の左:データソース

等号符の右:保存先項目

下記は取引先名、従業員数、業種って3項目を使って取引先を登録するマッピングファイルです。

#Mapping values
#Fri Api 26 16:19:33 GMT 2019
Name=Name
NumberOfEmployees=NumberOfEmployees
Industry=Industry

インポート設定を含む process-conf.xml ファイルを作成する

process-conf.xml ファイルには、データローダがデータを処理するために必要な情報が含まれています。

process-conf.xml ファイルの各 は、挿入、更新/挿入、エクスポートなどの単一の処理を参照するため、このファイルには、複数の処理が含まれることがあります。

このステップでは、Salesforce に取引先を挿入するためのファイルを編集します。

1.\samples\conf ディレクトリから process-conf.xml ファイルをコピーします。

 元のファイルには更新/挿入やエクスポートなどの他の種類のデータローダが含まれているため、必ずそのファイルをコピーしてください。

2.テキストエディタでファイルを開き、次の XML の内容に置き換えます。

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="accountInsert"
        class="com.salesforce.dataloader.process.ProcessRunner"
        singleton="false">
        <description>accountInsert job gets the account record from the CSV file and inserts it into Salesforce.</description>
        <property name="name" value="accountInsert"/>
        <property name="configOverrideMap">
            <map>
                <entry key="sfdc.debugMessages"
                       value="true"/>
                <entry key="sfdc.debugMessagesFile" 
                       value="C:\DLTest\Log\accountInsertSoapTrace.log"/>
                <entry key="sfdc.endpoint"
                       value="https://servername.salesforce.com"/>
                <entry key="sfdc.username"
                       value="admin@Org.org"/>
                <!--Password below has been encrypted using key file, 
                    therefore, it will not work without the key setting: 
                    process.encryptionKeyFile.
                    The password is not a valid encrypted value, 
                    please generate the real value using the encrypt.bat utility -->
                <entry key="sfdc.password"
                       value="e8a68b73992a7a54"/>
                <entry key="process.encryptionKeyFile" 
                       value="c:\Users\{user}\.dataloader\dataLoader.key"/>
                <entry key="sfdc.timeoutSecs"
                       value="600"/>
                <entry key="sfdc.loadBatchSize"
                       value="200"/>
                <entry key="sfdc.entity"
                       value="Account"/>
                <entry key="process.operation"
                       value="insert"/>
                <entry key="process.mappingFile" 
                       value="C:\DLTest\Command Line\Config\accountInsertMap.sdl"/>
                <entry key="dataAccess.name" 
                       value="C:\DLTest\In\insertAccounts.csv"/>
                <entry key="process.outputSuccess" 
                       value="c:\DLTest\Log\accountInsert_success.csv"/>
                <entry key="process.outputError" 
                       value="c:\DLTest\Log\accountInsert_error.csv"/>
                <entry key="dataAccess.type"
                       value="csvRead"/>
                <entry key="process.initialLastRunDate" 
                       value="2005-12-01T00:00:00.000-0800"/>
            </map>
        </property>
    </bean>
</beans>

3.process-conf.xml ファイル内の次のパラメータを編集します。プロセス設定パラメータについての詳細は、「データローダプロセスの設定パラメータ」を参照してください。

設定プロパティ名 設定説明
sfdc.endpoint 組織の Salesforce インスタンスの URL (https://yourInstance.salesforce.com/ など) を入力します。
sfdc.username データローダがログインに使用するユーザ名を入力します。
sfdc.password ステップ 2 で作成した、暗号化パスワードの値を入力します。
process.mappingFile 対応付けファイルのパスとファイル名を入力します。
dataAccess.Name インポートする取引先を含むデータファイルのパスとファイル名します。
sfdc.debugMessages 現在、トラブルシューティングの目的で、true に設定されています。インポートの実行を開始した後は、false に設定します。
sfdc.debugMessagesFile コマンドラインのログファイルのパスとファイル名を入力します。
process.outputSuccess 成功ログファイルのパスとファイル名を入力します。
process.outputError エラーログファイルのパスとファイル名を入力します。

dataAccess.Nameに僕は下記のcsvファイルのパスを設定しております。日本語の場合、UTF-8で保存しないと文字化けになる可能性が高い

Name,Industry,NumberOfEmployees
Dickenson plc,Consulting,120
GenePoint,Biotechnology,265
Express Logistics and Transport,Transportation,12300
Grand Hotels & Resorts Ltd,Hospitality,5600

プロセスを実行してデータをインポートする

[process.bat "<file path to process-conf.xml>" <process name>] 
//実行例
process.bat "C:\Program Files (x86)\salesforce.com\Data Loader\conf" accountInsert

※鍵の生成、パスワードの暗号化の部分にミスないように、「config.properties」ファイルと「Process-conf.xml」に設定することが大事

自分があったエラー: パスワードエラー、エンドポイントの設定ミスでサーバにアクセスエラー、文字化けなどがあります

config.Config decryptProperty (Config.java:704) - Error loading parameter: sfdc.password of type: java.lang.String」とか

mapping.LoadMapper mapData (LoadMapper.java:80) - Mapping for field ?Name will be ignored since destination column is empty」とか

visitor.BulkLoadVisitor addHeader (BulkLoadVisitor.java:242)」とか

【どうしもて文字化けの出力結果がある場合】

同じエディターでファイルを作成し直したら。。。僕がこれで解決した。

最後に

パスは日本語を使用しないほうがいいです。 文字化けなどによって、batファイルに指定したパスは通らなくて、実行できない可能性がある

config.properties ファイルを実行する権限が必要

config.properties ファイルにあるprocess.encryptionKeyFileのvalue設定はC:\Users\username\Documents\key.txtのように記述する

「\」が二つです。

参考サイト

データローダをバッチモードで使用する際の設定手順

CSVデータファイルの用意は UTF-8である必要がある、UTF-8のBOMはダメ

なぜなら、実行時にマッピングができない可能性が高い

?NameとNameマッピングできないとか

後日に抽出と更新を公開します。