Apex

ApexでSandbox組織と本番組織を判別する実装

外部システムへの接続先や画面の表示を、Sandboxと本番で切り替えたいことがあります。ApexではOrganizationオブジェクトのIsSandbox項目を見るだけで判別できます。

2020.07.17

なぜ環境を判別するのか

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との連携まで承ります。状況を伺ったうえで、進め方をご提案します。