【Salesforce】データローダをバッチモードで動かしてみた【エクスポート】

## この記事は
データローダをバッチモードで動かして、データをエクスポートするやり方です。

## 背景
ちょっと触ったので備忘のため。

## 実行環境
+ Windows11
+ DeveloperEdition環境
    + サインアップが必要

https://www.salesforce.com/form/developer-signup/?d=pb

+ JDK
    + バージョン：23
    + インストールが必要

https://www.oracle.com/java/technologies/downloads/?er=221886#jdk23-windows

+ Dataloader
    + バージョン：63.0.0
    + インストールが必要

https://help.salesforce.com/s/articleView?id=000383107&type=1

+ Salesforce CLI
    + バージョン：2.73.9
    + インストールが必要

https://developer.salesforce.com/ja/tools/salesforcecli

## テスト用フォルダを作成
データローダーをインストールすると
`C:\Users\{userName}\dataloader\{version}`
というフォルダが作成される。
※`{userName}`：Windowsのユーザ名
※`{version}`：データローダーのバージョン
その配下に以下のフォルダを作成する。
```
test
|_conf
|_data
|_status
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/b3bb0410-a931-42d4-9d5d-067664e1dabc.png)

## 暗号化鍵ファイル作成
コマンドプロンプトで
`
C:\Users\{userName}\dataloader\{version}\bin\encrypt.bat -k
`
をたたく。

<details><summary>実行結果</summary>

```
C:\Users\{userName}>C:\Users\{userName}\dataloader\{version}\bin\encrypt.bat -k
Data Loader requires Java JRE 17 or later. Checking if it is installed...

*************************************************************************
**                                                                     **
**              Salesforce Data Loader                                 **
**              ======================                                 **
**                                                                     **
**  Data Loader v63 is a Salesforce supported Open Source project to   **
**  help you import data to and export data from your Salesforce org.  **
**  It requires Java JRE 17 or later to run.                           **
**                                                                     **
**  Github Project Url:                                                **
**       https://github.com/forcedotcom/dataloader                     **
**  Salesforce Documentation:                                          **
**       https://help.salesforce.com/articleView?id=data_loader.htm    **
**                                                                     **
*************************************************************************


Keyfile "run.mode=encrypt" was created!
```
</details>

便宜上、名前を`dataLoader.key`に変えて、
`C:\Users\{userName}>C:\Users\{userName}\dataloader\{version}\test`
の直下に置く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/b2d6f145-da2c-4949-b079-7a11cb5aa5d0.png)

### 暗号化パスワードを作成
Developer Edition環境にログイン
＞画面右上の「プロファイルを参照」押下
＞「設定」
＞「私の個人情報」
＞「私のセキュリティトークンのリセット」
＞「セキュリティトークンのリセット」押下
で、トークンをリセットする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/975ced30-4c13-4403-9bc7-30e809e1ff66.png)


すると、support.salesforce.comからこんなメールが飛んでくる
```
最近パスワードが変更されたかセキュリティトークンのリセットが要求されたため、新しい Salesforce セキュリティトークンを送信いたしました。API またはデスクトップクライアントでセキュリティトークンが必要な場合は、この更新されたセキュリティトークンを使用してください。

ユーザー名: {user@example.com}
セキュリティトークン (大文字と小文字を区別): {securityToken}
```
※`{user@example.com}`：Developer Edition環境ログインユーザ名
※`{securityToken}`：セキュリティトークン（24文字英数字混在）

このトークンを以下のようにコマンドに入れて、コマンドプロンプトでたたく。
`
C:\Users\{userName}\dataloader\{version}\bin\encrypt.bat -e {password}{securityToken} dataloader.key
`
※{password}：Salesforce環境ログインパスワード

:::note warn
パスワードとセキュリティトークンの間は空けないこと。
例えば
+ パスワード：PASSWORD
+ トークン：TOKEN

だとしたら
`C:\Users\{userName}\dataloader\{version}\bin\encrypt.bat -e PASSWORDTOKEN dataloader.key`
のように記述する。
:::

<details><summary>実行結果</summary>

```実行結果
C:\Users\{userName}>C:\Users\{userName}\dataloader\{version}\bin\encrypt.bat -e {password}{securityToken} dataloader.key
Data Loader requires Java JRE 17 or later. Checking if it is installed...

*************************************************************************
**                                                                     **
**              Salesforce Data Loader                                 **
**              ======================                                 **
**                                                                     **
**  Data Loader v63 is a Salesforce supported Open Source project to   **
**  help you import data to and export data from your Salesforce org.  **
**  It requires Java JRE 17 or later to run.                           **
**                                                                     **
**  Github Project Url:                                                **
**       https://github.com/forcedotcom/dataloader                     **
**  Salesforce Documentation:                                          **
**       https://help.salesforce.com/articleView?id=data_loader.htm    **
**                                                                     **
*************************************************************************


The output string of encryption is:
{encryptedPassword}
```

</details>

## 対応付けファイル作成
`C:\Users\{userName}\dataloader\{version}\test\conf`
に、`accountExtractMap.sdl`を作成する。

### 記述例
今回はID、名前、電話番号を取得してみる。
```accountExtractMap.sdl
#Mapping values
#csvファイルヘッダ名=オブジェクト項目名
Id=Id
Name=Name
Phone=Phone
```

## 設定ファイル作成
`C:\Users\{userName}\dataloader\{version}\test\conf`
に、`process-conf.xml`を作成し、以下のように記述する。

### 記述例
```process-conf.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" 
    "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
    <bean id="csvAccountExtractProcess"
          class="com.salesforce.dataloader.process.ProcessRunner"
          scope="prototype">
      <description>csvAccountExtract job gets account info from salesforce and saves info into a CSV file."</description>
        <property name="name" value="csvAccountExtract"/>
        <property name="configOverrideMap">
            <map>
                <entry key="sfdc.debugMessages" value="false"/>
                <entry key="sfdc.debugMessagesFile" value="C:\Users\{userName}\dataloader\samples\status\sfdcSoapTrace.log"/>
                <entry key="sfdc.endpoint" value="{https://myInstance.salesforce.com}"/>
                <entry key="sfdc.username" value="{user@example.com}"/>
                <!-- password specified below is invalid, please generate one using the encrypt.bat utility -->
                <entry key="sfdc.password" value="{encryptedPassword}"/>
                <entry key="process.encryptionKeyFile" value="C:\Users\{userName}\dataloader\{version}\test\dataloader.key"/>
                <entry key="sfdc.timeoutSecs" value="600"/>
                <entry key="sfdc.loadBatchSize" value="200"/>
                <entry key="sfdc.entity" value="Account"/>
                <entry key="sfdc.extractionRequestSize" value="500"/>
                <entry key="sfdc.extractionSOQL" value="Select Id, Name, Phone FROM Account"/>
                <entry key="process.operation" value="extract"/>
                <entry key="process.mappingFile" value="C:\Users\{userName}\dataloader\{version}\test\conf\accountExtractMap.sdl"/>
                <entry key="dataAccess.type" value="csvWrite"/>
                <entry key="dataAccess.name" value="C:\Users\{userName}\dataloader\{version}\test\data\extract.csv"/>
            </map>
        </property>
    </bean>
</beans>
```
### 書き換えが必要な箇所
+ `sfdc.debugMessagesFile`：ログファイルのパスを入れる。ファイル名は規定値でOK。
+ `sfdc.endpoint`：Developer Edition環境のURLを入れる。
+ `sfdc.username`：ログインに使用するユーザー名を入れる。
+ `sfdc.password`：暗号化パスワードの値を入れる。
+ `process.encryptionKeyFile`：暗号化鍵ファイルのパスを入れる。
+ `process.mappingFile`：対応付けファイルのパスとファイル名を入れる。
+ `dataAccess.Name`：エクスポート先ファイルのパスとファイル名を入れる。

（記述例の波括弧が入っているところだけ書き換えれば大丈夫…なはず）

なお
`C:\Users\{userName}\dataloader\{version}\samples/conf`
配下にも`process-conf.xml`がある。
他の操作がしたいときにはここから設定ファイルをコピーして書き換えると楽。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/7c75e471-0833-4d60-839c-dc61ea7ab56b.png)

ここまで作業したら、
`C:\Users\{userName}\dataloader\{version}\test\conf`
の中は、こんな状態になっているはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/bcfb50c4-f40d-4e6b-ab2e-781fb8ec70ac.png)


## 実行
コマンドプロンプトで
`C:\Users\{userName}\dataloader\{version}\test`
に移動し、以下をたたく。
`C:\Users\{userName}\dataloader\{version}\bin\process.bat .\conf csvAccountExtractProcess`

<details><summary>実行結果</summary>

```
C:\Users\{userName}\dataloader\{version}\test>C:\Users\{userName}\dataloader\{version}\bin\process.bat .\conf csvAccountExtractProcess
Data Loader requires Java JRE 17 or later. Checking if it is installed...

*************************************************************************
**                                                                     **
**              Salesforce Data Loader                                 **
**              ======================                                 **
**                                                                     **
**  Data Loader v63 is a Salesforce supported Open Source project to   **
**  help you import data to and export data from your Salesforce org.  **
**  It requires Java JRE 17 or later to run.                           **
**                                                                     **
**  Github Project Url:                                                **
**       https://github.com/forcedotcom/dataloader                     **
**  Salesforce Documentation:                                          **
**       https://help.salesforce.com/articleView?id=data_loader.htm    **
**                                                                     **
*************************************************************************


2025-04-09 15:05:02,858 INFO  [main] process.ProcessRunner getInstance (ProcessRunner.java:298) - Initializing process engine
2025-04-09 15:05:02,858 INFO  [main] process.ProcessRunner getInstance (ProcessRunner.java:313) - process.nameis specified in the command line. Loading DynaBean with id csvAccountExtractProcess from process-conf.xml located in folder C:\Users\{userName}\dataloader\{version}\test\conf
2025-04-09 15:05:02,872 INFO  [main] process.ProcessConfig getBeanFactory (ProcessConfig.java:105) - Loading process configuration from config file: C:\Users\{userName}\dataloader\{version}\test\conf\process-conf.xml
2025-04-09 15:05:03,083 INFO  [csvAccountExtract] process.ProcessRunner run (ProcessRunner.java:135) - Initializing process engine
2025-04-09 15:05:03,087 INFO  [csvAccountExtract] process.ProcessRunner run (ProcessRunner.java:155) - Logging in to: https://login.salesforce.com/
2025-04-09 15:05:03,093 INFO  [csvAccountExtract] client.PartnerClient dologin (PartnerClient.java:638) - Beginning Partner Salesforce login ....
2025-04-09 15:05:03,114 INFO  [csvAccountExtract] client.PartnerClient loginInternal (PartnerClient.java:693) - Salesforce login to https://login.salesforce.com//services/Soap/u/63.0/ as user {user@example.com}
2025-04-09 15:05:03,979 INFO  [csvAccountExtract] process.ProcessRunner run (ProcessRunner.java:158) - Setting field types
2025-04-09 15:05:05,399 INFO  [csvAccountExtract] process.ProcessRunner run (ProcessRunner.java:162) - Creating Map
2025-04-09 15:05:05,403 INFO  [csvAccountExtract] dao.DataAccessObjectFactory getDaoInstance (DataAccessObjectFactory.java:55) - Instantiating data access object: C:\Users\{userName}\dataloader\{version}\test\data\extract.csv of type: csvWrite
2025-04-09 15:05:05,404 INFO  [csvAccountExtract] controller.Controller createDao (Controller.java:284) - Checking the data access object connection
2025-04-09 15:05:09,450 INFO  [csvAccountExtract] action.OperationInfo instantiateAction (OperationInfo.java:89) - Instantiating action for operation: extract
2025-04-09 15:05:09,466 INFO  [csvAccountExtract] controller.Controller executeAction (Controller.java:176) - executing operation: extract
2025-04-09 15:05:09,466 INFO  [csvAccountExtract] action.AbstractAction executeOperation (AbstractAction.java:161) - Loading: extract
2025-04-09 15:05:09,708 INFO  [csvAccountExtract] progress.NihilistProgressAdapter setSubTask (NihilistProgressAdapter.java:84) - Processed 0 of 14 records with 0 successes and 0 errors.
2025-04-09 15:05:09,713 INFO  [csvAccountExtract] progress.NihilistProgressAdapter setSubTask (NihilistProgressAdapter.java:84) - Processed 14 of 14 records with 14 successes and 0 errors.
2025-04-09 15:05:09,713 INFO  [csvAccountExtract] progress.NihilistProgressAdapter doneSuccess (NihilistProgressAdapter.java:75) - The operation has fully completed.  There were 14 successful extractions and 0 errors.
```

</details>


## 実行結果確認
`C:\Users\{userName}\dataloader\{version}\test\data`
の配下に`extract.csv`ファイルが作成され、取引先情報がエクスポートされている。
```extract.csv
"Id","Name","Phone"
"001gL000002PtXgQAK","Edge Communications","(512) 757-6000"
"001gL000002PtXhQAK","Burlington Textiles Corp of America","(336) 222-7000"
"001gL000002PtXiQAK","Pyramid Construction Inc.","(014) 427-4427"
"001gL000002PtXjQAK","Dickenson plc","(785) 241-6200"
"001gL000002PtXkQAK","Grand Hotels & Resorts Ltd","(312) 596-1000"
"001gL000002PtXlQAK","United Oil & Gas Corp.","(212) 842-5500"
"001gL000002PtXmQAK","Express Logistics and Transport","(503) 421-7800"
"001gL000002PtXnQAK","University of Arizona","(520) 773-9050"
"001gL000002PtXoQAK","United Oil & Gas, UK","+44 191 4956203"
"001gL000002PtXpQAK","United Oil & Gas, Singapore","(650) 450-8810"
"001gL000002PtXqQAK","GenePoint","(650) 867-3450"
"001gL000002PtXrQAK","sForce","(415) 901-7000"
"001gL000002PtXsQAK","Sample Account for Entitlements",""
"001gL000003A7cpQAC","ABC株式会社",""
```

## 参考資料
+ https://developer.salesforce.com/docs/atlas.ja-jp.252.0.dataLoader.meta/dataLoader/command_line_chapter.htm
+ https://note.com/keitafukui/n/n0b0a29e9e495
+ https://blog.logical.co.jp/entry/2020/06/12/090000

以上、データローダをバッチモードで動かして、データをエクスポートしてみたのでした。
おしまい。