チームスピリットデベロッパーブログ

チームスピリット開発者のブログ

Salesforce DX CLI から Apex を実行する

こんにちは、倉谷(id:a-kura)です。

今年もいつのまにかアドベントカレンダーの時期になってしまいました。皆さま、いかがお過ごしでしょうか?

さて、Salesforce DX CLI の紹介では、権限セットの付与やデータロードがデモされていましたが、実はもう一つ重要な機能があります。

そう、任意の Apex が実行できる機能です。

今回は、Salesforce DX CLI を使って、 Apex を実行する方法について紹介したいと思います。

f:id:a-kura:20171204124243p:plain

ヘルプ

まずは、Apex コードを実行するためのコマンドのヘルプを参照します。下記のコマンドを実行すると、ヘルプを表示できます。他のコマンドを調べるときも同様なので覚えておくと役立ちます。

$ sfdx help force:apex:execute
Usage: sfdx force:apex:execute [-f <file>] [-u <string>] [--json] [--loglevel <string>]

execute anonymous Apex code

Flags:
 -f, --apexcodefile APEXCODEFILE      path to a local file containing Apex code
 -u, --targetusername TARGETUSERNAME  username or alias for the target org;
                                      overrides default target org
 --json                               format output as json
 --loglevel LOGLEVEL                  logging level for this command invocation
                                      (error*,trace,debug,info,warn,fatal)

Executes one or more lines of Apex code, or executes the code in a local file.
Before you enter code, run this command with no parameters to get a prompt.
From the prompt, all commands are executed in a single execute anonymous request.
For more information, see "Anonymous Blocks" in the Apex Developer Guide.

Examples:
   $ sfdx force:apex:execute -f ~/test.apex

   $ sfdx force:apex:execute
   >> Start typing Apex code. Press the Enter key after each line,
   >> then press CTRL+D when finished.

コマンドラインから Apex コードを入力して実行する

では、コマンドラインから 直接 Apex コードを入力して実行してみましょう。 認証を済ませたあと、先ほどのヘルプで参照した内容を参考に実行してみます。

$ sfdx force:apex:execute

コマンドを実行すると、下記のようなメッセージが表示されて、入力待ちになります。

>> Start typing Apex code. Press the Enter key after each line,
>> then press CTRL+D when finished.

下記のように適当な Apex コードを入力して、CTRL+D を押下します。

System.debug('Hello, Astro!');

そうすると、実行結果が表示されます。 実行結果の内容を見ると、開発者コンソールから実行したときのログと同じものが表示されていることがわかります。

Compiled successfully.
Executed successfully.

41.0 APEX_CODE,DEBUG;APEX_PROFILING,INFO
Execute Anonymous: System.debug('Hello, Astro!');
23:41:42.11 (11567895)|USER_INFO|[EXTERNAL]|005xxxxxxxxxxxxxx|xxxxx@xxxxx.com|日本標準時|GMT+09:00
23:41:42.11 (11592457)|EXECUTION_STARTED
23:41:42.11 (11597237)|CODE_UNIT_STARTED|[EXTERNAL]|execute_anonymous_apex
23:41:42.11 (12249513)|USER_DEBUG|[1]|DEBUG|Hello, Astro!
23:41:42.12 (12311326)|CUMULATIVE_LIMIT_USAGE
23:41:42.12 (12311326)|LIMIT_USAGE_FOR_NS|(default)|
  Number of SOQL queries: 0 out of 100
  Number of query rows: 0 out of 50000
  Number of SOSL queries: 0 out of 20
  Number of DML statements: 0 out of 150
  Number of DML rows: 0 out of 10000
  Maximum CPU time: 0 out of 10000
  Maximum heap size: 0 out of 6000000
  Number of callouts: 0 out of 100
  Number of Email Invocations: 0 out of 10
  Number of future calls: 0 out of 50
  Number of queueable jobs added to the queue: 0 out of 50
  Number of Mobile Apex push calls: 0 out of 10

23:41:42.12 (12311326)|CUMULATIVE_LIMIT_USAGE_END

23:41:42.11 (12348943)|CODE_UNIT_FINISHED|execute_anonymous_apex
23:41:42.11 (13282152)|EXECUTION_FINISHED

ファイルから Apex コードを実行する

次に、Apex コードを保存したファイルから Apex コードを実行していましょう。 まずは、実行するための Apex コードを準備します。

ここでは、Apex コードが実行できるか試したいだけなので、先ほどと同じコードをファイルに保存します。

HelloAstro.apex
System.debug('Hello, Astro!');

先ほどのヘルプのとおり、ファイルを指定する場合は「--apexcodefile」または「-f」のあとにファイル名を入力します。

$ sfdx force:apex:execute --apexcodefile HellpAstro.apex

そうすると、先ほどコマンドラインから Apex コードを入力して実行したときと同じ実行結果になります。

活用方法

Apex コードが実行できると、どういった嬉しいことがあるのでしょうか?

実は、データの初期化などでオブジェクトのレコード間に相互参照などがあると、データインポートが難しくなることがあります。そういった場合には、Apex コードと組み合わせることで効率的にデータインポートができるようになります。

開発者がデータをクリアしたい場合、サンプルデータなどを一括作成する場合などには、Apex コードを準備しておくと、無駄な手間が少し省けるようになり、開発効率向上にも貢献できそうです。

また、オプション「--json」をつけて実行することで、実行結果をJSON形式で受け取ることができます。 JSON形式で受け取ることができれば、Jenkisやバッチ処理内で実行結果を条件判定するような処理を記述できるようになります。

シェルに組み込めるようになると、活用の幅も広がってきます。こういった柔軟性を与えることがこのコマンドのメリットと言えるでしょう。

むすび

Apex コードをコマンドラインから実行してみましたが、参考になりましたでしょうか?

Apex コードを実行できるようになることでかなり柔軟なことができるようになりますので、皆さまもよいアイデアがあれば共有してもらえると幸いです。

最後になりましたが、この投稿は チームスピリット Advent Calendar 2017 - AdventarSalesforce Platform Advent Calendar 2017 - Qiita 第2日目の投稿になります。

adventar.org

qiita.com

ハッピー・クリスマス!