こんにちは、製品開発部の李です。
SkyOnDemandを使ってSalesforceのデータ連携や処理を行う際は指定の時間にスクリプトを起動させたり、一定のインターバルでデータの監視などで自動化することが多いですが、要件によってはユーザーの操作によって起動させたい場合もあります。
私は普段SkyVisualEditorの開発に携わっているので、今回はSkyVisualEditorで作成した画面からSkyOnDemandのHTTPトリガーを呼び出す方法について紹介します。
まずは前準備として、SkyOnDemandサービスのHTTPトリガー情報を確認します。

連携する際に必要な情報は以下の2つです
- Authorizationヘッダー文字列
- パス
次はSkyVisualEditorの準備です。SkyVisualEditorではSkyOnDemandに限らず、機能の拡張をする際に利用できるインターフェースが幾つか用意されていますが、ここでは「Apexクラス拡張」を使いたいと思います。
最も手軽な方法として、SkyVisualEditorのスタジオ画面の右側の【ページ】タブ内の【Apexクラス拡張】-【Studioで直接編集】ボタンを押して、スタジオ内で直接Apexクラスを作成することが出来ます。

単純な例として、HTTPトリガーからのレスポンスをページにそのまま表示する場合は下記のコードになります。
//Apex拡張のクラス名は作成したページのページ名によって変わります。
global with sharing class SkyOndemandCalloutExtender extends SkyEditor2Dev.Extender{
public String message {get;set;}
public SkyOndemandCalloutExtender(SkyOndemandCallout extension){
}
//連携処理を行うactionを追加
public PageReference doCallout(){
//SkyOnDemandで取得したパス。トリガーの内容に応じて必要なパラメータをつけることも出来ます。
String url = 'https://www.skyondemand.net/ws/trigger/{トリガー名}?cid=xxxxxxxxxx&sid=xxxxx' ;
HttpRequest req = new HttpRequest();
req.setEndpoint(url);
req.setMethod('GET');
//SkyOnDemandで取得したAuthorizationヘッダー文字列をHeaderに設定。*注意:BASICの後にスペースが必要です
req.setHeader('Authorization','BASIC '+'{Authorizationヘッダー文字列}');
req.setTimeout(60000);
try{
Http http = new Http();
HttpResponse res = http.send(req);
message = res.getBody();
}catch(CalloutException ce){
system.debug('CalloutException' + ce);
}catch(Exception e){
system.debug('Exception' + e);
}
return null;
}
}
以上でSkyVisualEditorからSkyOnDemandを呼び出す準備が整いました。
次はその処理を呼び出すためのボタンを配置します。コンポーネントから【ボタン】【カスタム】を選びキャンバスに配置し、画像のようにプロパティにある【動作選択】を[画面遷移]から[JavaScript/Apex呼出]に変更し、【action】プロパティにある[...]ボタンをクリックし先ほど作成したactionを選びます。
また、表示用に【アイテム】【FreeText】を配置し、【値】のところに{!extender.message}と入力し、デプロイします。
以上の設定が完了した時のSkyVisualEditorの画面イメージ:

デプロイ後Salesforceの画面ではこのように、ボタンの押下後にレスポンスが画面上に反映されます。

以上がSkyVisualEditorからSkyOnDemandを呼び出す際の一例でした。
ここではコードとしては紹介しませんが、同じ要領でJavaScriptから呼び出すことも出来ます。
その場合SkyOnDemand側でヘッダーなどを工夫することで、SkyOnDemand側で集計した結果をCSVやExcelとしてダウンロードする、といったApexでは出来ない機能も実現できますが、アクセス元の違いなども合わせてセキュリティ上の要件を検討した上でご利用ください。


ポスト
