Salesforceの匿名ブロックと匿名ウィンドウはどちらもApexコードを一時的に実行する方法ですが、用途や動作の違いがあります。具体例を交えて解説します。
1. 匿名ブロック(Anonymous Block)
概要
- Salesforce開発コンソール(Developer Console)やVS CodeのExecute Anonymous機能を使って、一時的にApexコードを実行できる方法。
- クラスやメソッドの定義は不要で、Apexコードを直接記述して実行可能。
- トランザクションとして実行され、コミットされる(ロールバックは手動)。
使用例
開発コンソールで以下のコードを匿名実行すると、Account
レコードが作成されます。
Account acc = new Account(Name='Test Account');
insert acc;
System.debug('Created Account ID: ' + acc.Id);
主な特徴
✅ データベースへの変更(DML操作)はコミットされる。
✅ トランザクションは匿名実行全体を含む(エラーが起きるとロールバックされる)。
✅ @TestVisible や private メソッドも実行できる(通常はアクセス不可なprivateメンバーにもアクセス可能)。
実行結果の確認
-
開発コンソールの「ログ」タブ で
System.debug()
の出力を確認できる。 -
実際にレコードが作成されるので、
Account
オブジェクトで新しいレコードを確認可能。
2. 匿名ウィンドウ(Anonymous Window)
概要
- 開発コンソールの「実行」メニュー → 「開発用の匿名 Apex」ウィンドウ で開くApexコード入力画面のこと。
- 「匿名ブロックを実行するためのウィンドウ」であり、匿名ブロックと機能は同じ。
- 実行結果(ログ)をすぐに確認できる UI が用意されている。
使用例
-
開発コンソールを開く
-
設定 (⚙) > 開発コンソール
を開く
-
- 「実行」メニュー > 「開発用の匿名 Apex」 を選択
-
匿名ウィンドウにコードを記述して「実行」ボタンを押す
System.debug('Hello from Anonymous Window!');
- ログタブで「DEBUG」メッセージを確認。
主な特徴
✅ 匿名ブロックを実行するための専用ウィンドウ。
✅ 開発者が試しにコードを実行するのに便利なUIを提供。
✅ ログや結果を簡単に確認できる(ウィンドウの下部に出力される)。
✅ 実行結果はすぐに反映されるが、セッションが切れると保持されない。
3. 匿名ブロック vs. 匿名ウィンドウの比較
特徴 | 匿名ブロック | 匿名ウィンドウ |
---|---|---|
実行方法 | 開発コンソール、VS Code | 開発コンソールのUI |
実行内容 | Apexコード全体 | 匿名ブロックと同じ |
トランザクション | コード全体が1トランザクション | 同じ |
DML操作 | 可能(コミットされる) | 可能(コミットされる) |
ログの確認 | 開発コンソールの「ログ」タブ | 匿名ウィンドウ内で表示 |
使いやすさ | ログを開かないと見えない | すぐに結果が見える |
4. どちらを使うべき?
- ログをすぐに確認したい場合 → 匿名ウィンドウが便利
- VS Code や他のツールを使いたい場合 → 匿名ブロック(Execute Anonymous)
- データを変更するテストをしたい場合 → どちらでもOK(DML操作が可能)
- privateメソッドをテスト実行したい場合 → どちらでもOK(@TestVisibleのメソッドも実行可)
5. 注意点
✅ 本番環境(Production)では使用できない
匿名ブロックはSandbox や Developer Edition では実行できますが、本番環境では管理者権限があっても使用不可です。
✅ 大量データ処理には不向き
匿名ブロックの実行は一時的なものであり、バッチ処理のように大量のレコードを処理するには適していません。
✅ トランザクション管理に注意
匿名ブロックは1つのトランザクションとして扱われるため、途中でエラーが発生すると全体がロールバックされます。例えば、以下のコードでは2つ目の insert
でエラーが発生すると、1つ目の insert
も取り消されます。
Account acc1 = new Account(Name='Test Account 1');
insert acc1;
Account acc2 = new Account(); // Name がないのでエラー
insert acc2; // ここでエラーが発生すると、acc1 の挿入も取り消される
解決策:トランザクション制御を追加
try {
Account acc1 = new Account(Name='Test Account 1');
insert acc1;
Account acc2 = new Account(); // Nameがないのでエラー
insert acc2;
} catch (Exception e) {
System.debug('Error: ' + e.getMessage());
}
この方法でも acc1
はロールバックされますが、エラー処理が可能になります。
6. まとめ
匿名ブロック | 匿名ウィンドウ | |
---|---|---|
実行方法 | 開発コンソール / VS Code | 開発コンソール(UIあり) |
ログ確認 | 開発コンソールのログタブ | ウィンドウ内で即時確認 |
DML実行 | 可能(コミットされる) | 可能(コミットされる) |
トランザクション | コード全体が1トランザクション | 同じ |
用途 | ちょっとしたスクリプト実行 | 手軽にコードを試す |
- 開発コンソールで「実行 → 開発用の匿名 Apex」を開くと、それが匿名ウィンドウ
- 匿名ウィンドウで実行するApexコードそのものが匿名ブロック
つまり、「匿名ウィンドウ」は「匿名ブロックを記述するためのエディタ」 という位置づけです。
開発中に一時的なコード実行をしたい場合は、匿名ウィンドウを開いてコードを試し、デバッグを行うのが便利 です!