はじめまして。
フリーランスエンジニアのよねざわ(@satosiyonezawa)です。
私は以前からenebularとSalesforceのユーザなのですが
これらを連携させれば普段の業務が効率化できるのではないかと考えました。
なので今回は enebular で
Salesforceの特定条件の商談を取得して
Chatterで担当者に状況を確認するまでをやってみたいと思います。
#準備
- enebularの導入はこちら
- Introduction(公式)
- ↑から無料でアカウントを作ってHelloWorldの実行まですぐにできます
- Salesforceのアカウント入手
- 開発環境ならば無料で入手可能です
#最終完成図
完成形は以下のようなフローになります。
- SOQLを発行して商談データを取得
- 商談の数だけ文章を作成しchatterに投稿する
ということをやっています。
enebular公式サイトにフローを一般公開しているので
こちらも参考にしてください。

#Salesforceノードのインストールと認証
それではやっていきましょう。
まずはSalesofrceと連携するノードをインストールします
-
node-red-contrib-forceノード をインストール
- 右上の adminタブ をクリック
- node-red-contrib-force と入力
- Installボタン をクリック

- 追加された forceノード をドラッグ&ドロップで設置
- 設置したノードをダブルクリックで開き、Salesforceの認証情報入力画面を開く

- User NameはSalesforceのログイン時に使う ユーザ名 を
- Passwordは [パスワード] + [セキュリティートークン] の順でつなげて入力
- 入力例:パスが[pass1234]でトークンが[hgfg]なら[pass1234hgfg]を入力

#Salesforceセキュリティートークンの発行の仕方
Salesforceにログインして以下の画像の通りに進めてください。
セキュリティートークンが記載されたメールが送られてきます。


#SOQL(クエリ)発行
- Opertaionは query に設定
- maxFetcevalueには1回のクエリで最大取得数を設定

-
今回の取得条件は以下の3つなのでSOQLはこのようになりました
- 商談オブジェクト
- 最終活動日から1ヶ月以上
- 確度が50%以上
-
Owner.Name は商談の所有者をChatterの本文に組み込むために取得しています
SELECT
Id,Name,LastActivityDate,Probability,Owner.Name
FROM
Opportunity
WHERE
Probability >= 50
AND
LastActivityDate < LAST_N_DAYS:30
#SOQL(クエリ)実行してみる
ここまでで商談データが取得可能です。
実際に実行してみましょう。
- debugノードを設置
- injectノードをクリックして実行
- デバッグタブで商談データが複数件取得していることが確認できます

#取得件数分、処理を実行する(ループ実行)
- enebular(NODE-RED)特有のループ処理を書いていきます
- changeノード
- ループカウントの初期化
- 商談の取得件数をループ回数に設定

- switchノード
- ループカウントがループ回数に達したら処理を止める
- TIPS:追加ボタンを押して条件に[その他]を設定することでelseのような分岐処理をすることもできます

- functionノード
- ループカウントをインクリメント(+1)します
- 画像のようにノードをつないで8の字にします
- そうすることでループカウントがループ回数に達した時に止まる処理を実現できます

- Chatterの文章に組み込みたいデータをmsgに設定
- Name → 商談名
- Owner.Name → 所有者名
- Id → salesforceのレコードId

msg.Name = msg.payload[msg.loopcount].Name;
msg.OwnerName = msg.payload[msg.loopcount].Owner.Name;
msg.salesforceId = msg.payload[msg.loopcount].Id;
return msg;
- templateノードでChatter文を作成
- {{msgにぶら下がる項目名}} のように設定することでmsgのデータが使えます
- 商談のURLは直接URLにsalesforceIDを組み込んでいます
- このようにテンプレートを作成しmsg.payloadに設定してChatterノードへ送ります

- Chatterノード
- Operationに Post Feed を設定するとpayloadの内容が投稿されます
- Mentionを設定するとSalesforceのメンション機能を使えますがメンション先が固定されてしまいます。商談リマインドグループなどを作成してそこにメンションするか、SOQLのWhere句の商談所有者とメンション先を一致させてフローを複数作成するかなどの方法があります。

#フロー実行からChatter投稿確認まで
- injectノードをクリックしてフローを実行します
- 取得できた商談件数分、Chatterが投稿されていることが確認できます

#まとめ
enebularで
Salesforce認証→SOQL発行→文章作成→Chatter投稿
という流れを行いました。
- forceノードを使うと簡単にSalesforce連携ができる
- ループ処理の実行はNode-RED特有の工夫が必要
- enebularだと複数のシステムを組み合わせた業務効率化ができそう