tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:カスタムボタンからApexを呼び出す方法

Salesforceのカスタムボタンやカスタムリンクを作成するとき、JavaScriptを実行することができます。これを利用してApexクラスの処理を実行することも可能です。

f:id:tyoshikawa1106:20161016203547p:plain


カスタムボタンでApexを実行したい場合、次の宣言が必要になります。

{!REQUIRESCRIPT("/soap/ajax/<APIバージョン>/connection.js")} 
{!REQUIRESCRIPT("/soap/ajax/<APIバージョン>/apex.js")} 


Apex処理を呼び出す処理はこのようになります。

var result = sforce.apex.execute ( 
  <クラス名>, 
  <メソッド名>, {
    // 引数があれば..
  } 
);


例)

{!REQUIRESCRIPT("/soap/ajax/38.0/connection.js")} 
{!REQUIRESCRIPT("/soap/ajax/38.0/apex.js")} 

var result = sforce.apex.execute ( 
  "UserWebService", 
  "changeLanguage", { } 
);
if ( result == ""){ 
  location.reload(); 
} else { 
  alert(result); 
  location.reload(); 
}


JavaScriptから呼び出すApexをつくるときはWebServiceを利用します。次のような感じです。

global with sharing class UserWebService {
    
    WebService static String changeLanguage() {
        try {
            // ログインユーザの情報取得
            User user = getLoginUserInfo();    
            // 現在の言語の判定と変更後の言語をセット
            user = setUserLanguage(user);
            // 更新
            update user;
        } catch (Exception e) {
            return 'システムエラーが発生しました。';
        }
        
        return '';
    }
    
    // 略...
}

クラスにはglobalを宣言してメソッド名にはWebServieとstaticを宣言します。

利用例

例えばユーザの言語を更新するようなカスタムボタンを用意したりできます。JavaScriptなので画面のリフレッシュや別ページへの移動などの処理を追加することもできます。
f:id:tyoshikawa1106:20161016204310p:plain

f:id:tyoshikawa1106:20161016204322p:plain


このような感じでApexと組み合わせることでカスタムボタン/カスタムリンクでできる幅が広がります。注意点としてJavaScriptからApexを呼び出すにはSalesforceAPIを消費することになります。組織のAPI消費数の制限に注意して設計する必要があります。

サンプルコード