LoginSignup
3
1

More than 1 year has passed since last update.

Autify で Salesforce を動かしてみよう~ vol.12 JSステップで外部APIにアクセスする

Last updated at Posted at 2022-03-21

はじめに

  • Autify で Salesforce を動かしてみよう、と思い記事にしてみます。
  • TIPSなども記載できれば、と考えています。

何をするの

Autify JavaScript Snippets( https://autify-javascript-snippets.netlify.app/ja/ )で
気になるコードを見つけました。

var url = "*** API URL ***";
var xhr = new XMLHttpRequest();

xhr.open("POST", url, false);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("key=value");

if (xhr.status !== 200) {
  throw new Error("Error " + xhr.status);
}

console.log(JSON.parse(xhr.response));

このコードを利用すると外部のAPIに対して、アクセスすることができます。
これで何ができるのか、を考えてみましょう。

URL を指定して、POSTGET にて、送信、その結果を JSON形式 で返すことが
できるようです。

Google SpreadSheet で簡易サーバを作成する

Google SpreadSheet は簡易的なサーバを作成することができます。
こちらにアクセスして、値を取得できるか試してみましょう。

SpreadSheetに以下のようにします。
 「A列にキー、B列に値
この組み合わせデータを返すようにしましょうか。

image.png

SpreadSheet 側のコードは、以下のようにしました。
doGet で、GETの処理を行うことができます。

function doGet(e) {
  var loadData = LoadData_();
  
  var output = ContentService.createTextOutput();
  output.setContent(JSON.stringify(loadData));
  output.setMimeType(ContentService.MimeType.JSON);

  return output;
}


function LoadData_() {
  var sheetId = "*** SheetId ***";
  var spreadSheet = SpreadsheetApp.openById(sheetId);

  var sheet = spreadSheet.getSheetByName("Data");

  var json = {};

  var values = sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).getValues();
  
  for (var row = 0; row < values.length; row++) {
    var key   = values[row][0];
    var value = values[row][1];
    
    json[key] = value;
  }

  return json;
}

コードが完成して、十分にテストが完了したら、デプロイします。
デプロイ から 新しいデプロイ を選びます。

image.png

新しいデプロイ から 設定します。
ここで嵌ったのが、次のユーザーとして実行アクセスできるユーザー でした。
以下のように指定します。【はまりポイント】

項目 設定値
次のユーザーとして実行 自分
アクセスできるユーザー 全員

ソースコードを修正する度に、デプロイが必要になります。

「アクセスできるユーザー」が「全員」なので、セキュリティ面で弱いように思います。
実際の運用で使用する場合は、セキュリティ面での対策が必要です。

image.png

[デプロイ]をクリックすると、以下のように URL が表示されます。
ウェブアプリ」に表示されている URL をコピーします。

image.png

URLにアクセスしたとき、適切な値が返ってくるか、curl コマンドを使って確認すると良いでしょう。

Autify 側 ステップの準備

Autify 側の JSステップでは、以下のように記載します。

  1. URL には、前述のURL を指定します。
  2. xhr.openメソッドでは、"GET" を指定します。
  3. xhr.sendにて、APIを実行します。実行しないと、xhr.status0 になります。
    • パラメータの key=value については、使用していません(汗
  4. 実行した結果、xhr.response にてJSONの文字列形式で返すことから、そのまま JSステップ上も return します。
    • JSON の文字列をreturnすることで、複数の値をJSステップで渡すことができます。
var url = "https://script.google.com/macros/s/*** ライブラリのURL ***/exec";
var xhr = new XMLHttpRequest();

xhr.open("GET", url, false);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("key=value");

if (xhr.status !== 200) {
  throw new Error("Error " + xhr.status);
}
return xhr.response;

以下のような流れを構築しました。

  1. [ステップ2] で JSステップを利用して、SpreadSheetから値を取ります。
  2. [ステップ5] で値を取得し、[ステップ6] でテキストボックスに格納する、と言う動きになります。
    ([ステップ7][ステップ8] でも同じです)

image.png

  • [ステップ2] の詳細
    前述のコードを使用しています。

image.png

  • [ステップ5] の詳細
    キー key1 の値を取り出して、return します。
    image.png

  • [ステップ6] の詳細
    [ステップ5] で取り出したテキストボックスに書き込みます。
    image.png

  • 「実行結果」 の詳細
    正常終了していますね。

image.png

  • [ステップ7] の詳細
    取り出した値をセットできています。
    image.png

さいごに

Autify 内部に値を持たず、外部から値を注入することができました。
今回は取得のみでしたが、POST にすることで書き込むこともできるでしょうし、

また、接続先を Google SpreadSheet にしましたが、
AWS で Lambda などにしても良いのかな、と思いました。

外部API先をシステム特有の動きにしても良いと思います。
例えば、

  • システム専用の特殊な文字列を生成する。
  • テストに必要となるテストデータをSQLで作成するAPIを用意しておき、ステップの初期化処理を行う。
  • ログ出力APIを用意しておき、Autify の自動実行中からログ出力する。

ご了承ください

  • まだまだ勉強中の部分もあります。間違っている箇所もあるかもしれません。
  • Salesforce、Autify は、この時点のバージョン(2022年3月頃) での内容になります。今後、仕様変更が変わることによって、内容の通りにならない可能性もあります。ご了承ください。
  • また、URLなども変更になっている可能性もあります。

過去の記事

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1