ApexでSandbox組織と本番組織を判別する実装
外部システムへの接続先や画面の表示を、Sandboxと本番で切り替えたいことがあります。ApexではOrganizationオブジェクトのIsSandbox項目を見るだけで判別できます。
なぜ環境を判別するのか
Sandboxはリフレッシュのたびに中身が本番からコピーされます。外部システムの接続先やユーザー名を、コードの中で環境ごとに変えておかないと、リフレッシュのたびに設定を書き換える羽目になります。Apexの中でいまSandboxか本番かを判別できれば、この切り替えをコードだけで完結できます。
Organizationオブジェクトで判別する
判別に使うのはOrganizationオブジェクトのIsSandbox項目です。組織につき1件しか存在しないオブジェクトなので、WHERE句なしでそのまま取得できます。
Organization org = [SELECT IsSandbox FROM Organization]; System.debug('IsSandbox: ' + org.IsSandbox);
現在の組織がSandboxかどうかをBoolean値で取得します
IsSandboxは読み取り専用のBoolean項目で「現在の組織がSandbox(true)か本番(false)かを示す」と説明されています。API バージョン31.0以降で利用できます。org.IsSandboxがtrueならSandbox、falseなら本番です。
呼び出すたびにクエリを発行しない
[SELECT IsSandbox FROM Organization]は組織の設定が変わらない限り結果も変わりません。同じトランザクションの中で何度も呼び出すクラスがあるなら、static変数にキャッシュしてSOQLの発行回数を節約します。
public with sharing class OrgEnvironment { private static Boolean isSandboxCache; public static Boolean isSandbox() { if (isSandboxCache == null) { isSandboxCache = [SELECT IsSandbox FROM Organization].IsSandbox; } return isSandboxCache; } }
1トランザクション内では最初の1回だけクエリします
使用例1 外部システムの接続先を切り替える
外部システムがSandbox用と本番用でエンドポイントが分かれている場合、判別結果でURLを出し分けます。
public with sharing class ExternalSystemClient { public static String getEndpoint() { return OrgEnvironment.isSandbox() ? 'https://sandbox-api.example.com/v1' : 'https://api.example.com/v1'; } }
環境に応じて呼び出すエンドポイントを切り替えます
エンドポイントのユーザー名やパスワードも、実際には値をコードへ直接書かず、指定ログイン情報(Named Credential)などに環境ごとの値を登録し、OrgEnvironment.isSandbox()の結果でどちらを使うか選ぶ形にします。
使用例2 画面の表示を環境で出し分ける
本番環境でだけ特定の要素を表示したい場合は、コントローラで判定結果をゲッターとして公開します。
public with sharing class EnvironmentController { public Boolean getIsProduction() { return !OrgEnvironment.isSandbox(); } }
本番環境かどうかをVisualforceページへ渡します
<apex:page controller="EnvironmentController"> <apex:outputPanel rendered="{!isProduction}"> 本番環境でだけ表示したい内容をここに置きます </apex:outputPanel> </apex:page>
本番環境のときだけ内側の要素を表示します
アクセス解析タグのように、本番環境だけで動かしたい仕組みを出し分ける用途に使えます。
自組織のURLが必要なとき
Sandboxか本番かの判別とは別に、いま動いている組織自身のURLが必要なときはURL.getOrgDomainUrl()を使います。
String orgBaseUrl = URL.getOrgDomainUrl().toExternalForm();
現在の組織の正規URLを取得します
⚠️ 古い記事ではSystem.Url.getSalesforceBaseUrl()が使われていることがありますが、公式のApexリファレンスはAPI バージョン59.0以降でこのメソッドが非推奨(deprecated and versioned out)になったと明記しています。代わりにgetOrgDomainUrl()(組織の正規URLを取得)か、リクエストのURLが必要な場合はgetCurrentRequestUrl()を使います。
ここで間違えやすい
| 間違い | 何が起きるか |
|---|---|
呼び出すたびに[SELECT IsSandbox FROM Organization]を発行する | 結果は変わらないのに、呼び出すクラスの分だけSOQLを消費します |
| ホスト名の文字列でSandboxかどうかを推測する | Sandboxか本番かは公式にIsSandboxが用意されています。ホスト名の推測に頼る必要はありません |
System.Url.getSalesforceBaseUrl()を新規コードで使う | API バージョン59.0以降で非推奨です。getOrgDomainUrl()に置き換えます |
確認した環境
- 2026年9月 / Salesforce Summer '26(API バージョン 67.0)時点の公式ドキュメントで、
Organization.IsSandboxの仕様とURLクラスの非推奨メソッドを確認しています
まとめ
- Sandboxか本番かは
OrganizationオブジェクトのIsSandbox項目(Boolean・API 31.0以降)で判別します - 判別結果は変わらないので、同じトランザクションで何度も使うならstatic変数にキャッシュします
- 外部システムの接続先や画面表示を、判別結果で環境ごとに出し分けられます
- 自組織自身のURLが必要なときは
URL.getOrgDomainUrl()を使います System.Url.getSalesforceBaseUrl()はAPI バージョン59.0以降で非推奨です
Salesforceの導入・運用についてご相談ください
導入前の検討から、お使いの環境の改修・運用、AIとの連携まで承ります。状況を伺ったうえで、進め方をご提案します。