🤷‍♀️

SalesforceフローからHTTPコールアウトしてみた

に公開

概要

今回、SalesforceのフローにあるHTTPコールアウトアクションを利用して、外部システム連携を試してみました。具体的には、以下のような処理を実装しようと考えました。

  1. カスタムオブジェクトにレコードが追加される
  2. それをトリガにSalesforceフローが起動
  3. Salesforceフロー内でHTTPコールアウトアクション(GET)を実行
  4. Google Apps Script(GAS)でリクエストを受け取り、データを加工
  5. 加工したデータをGoogleスプレッドシートに転記

実際の業務では、Salesforceのカスタムオブジェクトに追加された情報をスプレッドシートで管理したい、といったケースで活用できそうな仕組みです。

受信側のGAS

doGetでHTTPコールアウトを受信します。

function doGet(e) {
  const data = e.parameter;
    
  // スプレッドシートを開く(事前に作成したシートのIDを設定)
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName('シート3');
    
  // データを整形してスプレッドシートに追加
  const row = [
    '',
    data.CreatedDate || '', // 申込日
    '',
    data.ClientIdLancers || '', // 法人ID
    '',
    data.CompanyName || '', // 会社名
    data.UserNickname || '', // ユーザー名
    data.Email || '' // メールアドレス
  ];
  sheet.appendRow(row);

  // HTTPステータスコード200を明示的に返す
  const response = ContentService
    .createTextOutput(JSON.stringify({
      status: 'success',
      message: 'Salesforce認証完了!',
      timestamp: new Date().toISOString()
    }))
    .setMimeType(ContentService.MimeType.JSON);

  return response;
}

WEBアプリとしてデプロイを行う

発行されたWEBアプリURLを後述で設定します。

Salesforce設定内容

以下の公式ヘルプサイトを参考に設定を行いました。
https://help.salesforce.com/s/articleView?id=platform.flow_http_callout.htm&type=5

外部ログイン情報

指定ログイン情報

権限セット

HTTPコールアウトを行えるユーザを割り当てる必要があります。

前述で作成した外部ログイン情報を有効にする

割り当てに自分を追加

Salesforceフローの設定

  1. カスタムオブジェクトへのレコード追加をトリガに設定します。

  2. HTTPコールアウトを非同期パスに追加します。

  3. HTTPコールアウトの外部サービスを追加します。

  4. 外部サービスにアクションを追加します。
    URLパスにはGASで発行されたパスの「/macros/~」以降を設定します。
    また、クエリパラメータにはスプシに連携する項目を入力します。

  5. 「応答の例を使用」を選択して次へ
    ⇒保存するためにいったんこちらを選択

  6. サンプル JSON 応答に{}を入力して保存します。

  7. フローに戻り、アクション要素を設定します。(※上で追加したアクションとは別のフロー自体のアクション)
    クエリパラメータにオブジェクトの項目を対応付けします。

  8. フローを有効化します。
    ※Slack通知も追加されていますが、HTTPコールアウトには関係ないです。

設定は以上です。
さらっと書いていますが、ヘルプサイトには明記されていない設定方法の数々でかなり大変でした^^;
後は実際にカスタムオブジェクトにレコードを追加し、スプシに連携されたかを確認していきます。

結果

できたこと

スプレッドシートへのデータ転記が成功
Salesforceのカスタムオブジェクトレコードの内容を、GASを経由してGoogleスプレッドシートに転記することができました。
フローからのHTTPコールアウト自体は正常に動作し、GAS側でもリクエストを適切に受け取れました。

できなかったこと

重複レコードの問題が発生
1つのレコードにつき、スプレッドシートに1行追加されることを期待していました。
しかし実際には、同じレコードが何行も追加されてしまう現象が発生。
⇒原因推測:HTTPコールアウトが意図せず複数回実行されている可能性がある

HTTPコールアウト時に302が返ってしまう
GETは呼ばれるが、「Moved Temporarily」というメッセージとともに302エラーが返ってきてしまいました。
⇒原因推測:GASは仕様上、「 The document has moved~」の後に書かれたURLへリダイレクトしてからデータの受け取りなどを行うようになっているようで、Salesforce側でそのURLが解釈できないため。

まとめ

SalesforceフローからHTTPコールアウトを利用した外部連携は基本的な動作確認はできましたが、重複実行と302エラーの課題が残りました。この問題を解決できれば、Salesforceと外部システム間のリアルタイム連携として非常に有用な仕組みになると感じています。

この記事が同様の課題に取り組んでいる方の参考になれば幸いです。改善案や他のアプローチについて、ぜひコメントでお聞かせください!

ランサーズ株式会社

Discussion