enebularを使ってSalesforceの商談を取得しChatterに投稿をする

はじめまして。
フリーランスエンジニアのよねざわ(@satosiyonezawa)です。

私は以前からenebularとSalesforceのユーザなのですが
これらを連携させれば普段の業務が効率化できるのではないかと考えました。

なので今回は [**enebular**](https://www.enebular.com/ja/index.html) で
Salesforceの特定条件の商談を取得して
Chatterで担当者に状況を確認するまでをやってみたいと思います。

#準備
- enebularの導入はこちら
  - [Introduction(公式)](https://docs.enebular.com/ja/GetStarted/Introduction.html)
  - ↑から無料でアカウントを作ってHelloWorldの実行まですぐにできます
- Salesforceのアカウント入手
    - 開発環境ならば[無料で入手可能](https://developer.salesforce.com/signup)です

#最終完成図
完成形は以下のようなフローになります。

- SOQLを発行して商談データを取得
- 商談の数だけ文章を作成しchatterに投稿する

ということをやっています。
enebular公式サイトにフローを一般公開しているので
こちらも参考にしてください。

- [最終活動日から1ヶ月以上かつ確度が50％以上の商談を取得してChatterで状況を確認する](https://enebular.com/discover/flow/2aac82ed-b948-4dc2-b7b4-84604a669e84)


<img width="689" alt="スクリーンショット 2019-09-22 15.47.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/47c0bac9-d033-45e2-1fbb-3d747cd4ab43.png">





#Salesforceノードのインストールと認証
それではやっていきましょう。
まずはSalesofrceと連携するノードをインストールします

- **node-red-contrib-forceノード** をインストール
    - 右上の **adminタブ** をクリック
    - **node-red-contrib-force** と入力
    - **Installボタン** をクリック
<img width="990" alt="スクリーンショット 2019-09-22 15.38.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/9586d6ab-ef8c-54d2-dd5e-99abbb6c8045.png">

- 追加された **forceノード** をドラッグ&ドロップで設置
- 設置したノードをダブルクリックで開き、Salesforceの認証情報入力画面を開く
<img width="1267" alt="スクリーンショット 2019-09-22 16.05.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/c79a6e49-095c-6720-8620-eb8d4f216581.png">

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

<img width="496" alt="スクリーンショット 2019-09-22 16.09.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/ea5e517e-7c01-db3a-1f22-22081691e877.png">

#Salesforceセキュリティートークンの発行の仕方
Salesforceにログインして以下の画像の通りに進めてください。
セキュリティートークンが記載されたメールが送られてきます。
<img width="885" alt="スクリーンショット 2019-09-22 16.13.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/29ec5904-18d5-b4f6-f12b-463dfbdda4e5.png">

<img width="863" alt="スクリーンショット 2019-09-22 16.18.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/7ce03d39-b1a0-690f-66cd-ebf65d2dc0a5.png">

<img width="977" alt="スクリーンショット 2019-09-23 8.32.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/83e3fef5-7e78-a5c2-ef38-2918b3f3cd11.png">


#SOQL(クエリ)発行

- Opertaionは **query** に設定
- maxFetcevalueには１回のクエリで最大取得数を設定

<img width="499" alt="スクリーンショット 2019-09-22 16.27.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/b074367e-87e1-2ea7-5376-610aed8b78a0.png">

- injectノードを設置して文字列に設定しSOQLを入力します<img width="1066" alt="スクリーンショット 2019-09-22 16.30.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/0c9e9df7-ad64-9257-3242-a9e2605451a5.png">

- 今回の取得条件は以下の３つなのでSOQLはこのようになりました
    - 商談オブジェクト
    - 最終活動日から1ヶ月以上
    - 確度が50％以上
- **Owner.Name** は商談の所有者をChatterの本文に組み込むために取得しています  

```SQL
SELECT
  Id,Name,LastActivityDate,Probability,Owner.Name
FROM
  Opportunity
WHERE
  Probability >= 50
  AND
  LastActivityDate < LAST_N_DAYS:30
```


#SOQL(クエリ)実行してみる
ここまでで商談データが取得可能です。
実際に実行してみましょう。

- debugノードを設置
- injectノードをクリックして実行
- デバッグタブで商談データが複数件取得していることが確認できます
<img width="1381" alt="スクリーンショット 2019-09-22 16.43.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/e1d154d2-b874-4029-4e5b-0fedbb6244e9.png">

#取得件数分、処理を実行する(ループ実行)

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

<img width="993" alt="スクリーンショット 2019-09-22 17.00.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/b8839068-a3e3-96c7-d2aa-e30f54693407.png">

- switchノード
  - ループカウントがループ回数に達したら処理を止める
  - TIPS：追加ボタンを押して条件に[その他]を設定することでelseのような分岐処理をすることもできます
<img width="1186" alt="スクリーンショット 2019-09-22 17.15.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/c410e9f2-6bce-6846-a1e3-1220f0146cdd.png">

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

<img width="1028" alt="スクリーンショット 2019-09-22 17.24.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/0e242f64-45b8-0b05-d4f8-50886f41fade.png">


- Chatterの文章に組み込みたいデータをmsgに設定
      - Name → 商談名
      - Owner.Name → 所有者名
      - Id → salesforceのレコードId 
<img width="1343" alt="スクリーンショット 2019-09-22 18.24.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/a306bb6a-fb0a-bd52-3411-9196e6e9b82c.png">

```js
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ノードへ送ります

<img width="1395" alt="スクリーンショット 2019-09-22 17.40.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/44af6792-f3df-a60c-557c-d6266726c730.png">

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

<img width="1339" alt="スクリーンショット 2019-09-22 18.06.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/64e07438-93b3-b68c-0d47-2abe60917904.png">

#フロー実行からChatter投稿確認まで

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

<img width="939" alt="スクリーンショット 2019-09-22 18.31.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270185/26aa92ce-c889-df6e-e18b-e928c8d66c66.png">

#まとめ
enebularで
Salesforce認証→SOQL発行→文章作成→Chatter投稿
という流れを行いました。

- forceノードを使うと簡単にSalesforce連携ができる
- ループ処理の実行はNode-RED特有の工夫が必要
- enebularだと複数のシステムを組み合わせた業務効率化ができそう