Salesfroceからユーザにメールを送る場合に、よく要望に上がるのが、「オブジェクトの詳細画面のURLをメールに差し込んで欲しい」というものです。
たとえば、あるオブジェクトに更新があった場合に、ユーザにメールを送るとして、そのメールに変更のあったオブジェクトへのリンクがあれば、そのリンクをクリックすれば、すぐに詳細画面で確認したり、編集したりすることができますよね。
(詳細画面を見るには、もちろんSalesforceへログインすることが前提です。)
どんなURLを埋め込めばいいのか
良く知られているように、Salesforceでは、あるオブジェクトのURLは、
「https://ns31.salesforce.com/オブジェクトId」
のように表現されます。
オブジェクトIdの部分がオブジェクトごとに異なるのは当然ですが、「ns31.salesforce.com」の部分も割り当てられたSFDCインスタンスによって異なり、場合によっては本番環境とSandbox環境でも異なります。
そのため、直にインスタンス名を書いてしまうと、環境が変わったときに、クリックしても表示できないURLになってしまいますから、動的にホスト名(インスタンス名)を取得しないといけません。
そのためには、VisualforceページやVisualforceEmailテンプレートで使用できる「グローバル変数」を使うことができます。
「グローバル変数」は、環境に依存する組織のデータが格納されている変数で、API呼び出しのホスト名や組織の言語など、様々な値を取得できます。
オブジェクトの詳細画面のURLを差し込むには?
この場合、
{!(LEFT($Api.Enterprise_Server_URL_300, FIND('/services',$Api.Enterprise_Server_URL_300))+relatedTo.Id)}
のように「$Api」が使えます。
「{!$Api.Enterprise_Server_URL_300}」には「https://ns31.salesforce.com/services/Soap/c/30.0/00Dp0000000Cnjc」のようにAPIをコールするURLが入っていますので、LEFT関数で「/services」より左側を取ってくるわけです。
なお、Enterprise_Server_URL_XXXの300はAPI のバージョンを示します。たとえば、{!$Api.Enterprise_Server_URL_260} は、バージョン26.0のAPI のエンドポイントを表しています。
(SalesforceではAPIバージョンによって、エンドポイントが異なります。)
以下に、VisualforceページやVisualforceEmailテンプレートで使用できるグローバル変数と数式の演算子と関数のページを載せておきます。
使用できるグローバル変数
https://help.salesforce.com/articleView?id=dev_understanding_global_variables.htm&language=ja&type=0
使用できる数式の演算子と関数
https://help.salesforce.com/articleView?id=customize_functions.htm&type=0