Salesforce→Slack通知をオープンソースで公開しました

![salesforcetoslack.jpg](https://qiita-image-store.s3.amazonaws.com/0/27267/bf4f4342-41a6-b242-dfbd-82592d626ad9.jpeg)

こんにちは。co-meetingの木村です。

弊社ではSalesforceとSlackの連携は[Zapier](https://zapier.com/)で実現しているんですが、Zapierはオブジェクトの新規作成にしか対応していなかったり、15分おきだったり、Salesforceは有償のみだったりでちょっといまいちなのです。

というわけで、以下の方針でSalesforceからSlackへのリアルタイム通知を作ってみました。

1. Slack通知オブジェクトを作成し、Apexトリガで作成時にSlackに通知するよう設定。
2. プロセスビルダーで何か通知したいことを監視して、Slack通知オブジェクトを作成する。

通知の設定はプロセスビルダーでできるので開発者じゃなくても簡単にできますし、プロセスビルダーでできることはなんでもできるので、けっこういろいろな通知ができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/27267/b72cea09-669c-f326-efdd-18177f0f9ff2.png)


ソースもGithubで公開して、未管理パッケージのURLも提供していますので、お好きにご利用ください。

- ソースコード
    - https://github.com/atskimura/salesforcetoslack
- パッケージ
    - https://login.salesforce.com/packaging/installPackage.apexp?p0=04t28000000ULv7

どう実装したかはそんなに難しくないので直接Githubを見ていただくとして、この記事では主に使い方を説明します。

# どんなことができるか

これを使うと以下のようなことができます。

- 新規リードを通知
- 商談のフェーズが変更されたら通知
- フォーム画面から全社に一斉通知
- Botの振りして誰かと会話
- タスクが追加されたら担当者にメンション（すんなりはできないかもしれない…）
- ワークフローの承認通知をダイレクトメッセージ（すんなりはできないかもしれない…）
- 毎朝未完了のタスクを通知（Apexスケジューラ使えば…）

意外と応用範囲が広いです。

# インストール

## 1. SFDC組織にパッケージをインストール

https://login.salesforce.com/packaging/installPackage.apexp?p0=04t28000000ULv7

## 2. SlackでIncoming WebHookを設定

[Incoming WebHooks | Slack](https://slack.com/apps/A0F7XDUAZ-incoming-webhooks)からIncoming WebHooksをインストールして、表示されたWebhook URLをコピーします。

<img width="1324" alt="Incoming_WebHooks___co-meeting-dev_Slack.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/5eaa1086-f162-8241-0d52-bd239e9db6bb.png">

## 3. カスタム設定Slack Settingsに設定

[開発]>[カスタム設定]を開き、「Slack Settings」の「Manage」をクリックします。

以下の「新規」ボタンをクリックします。

<img width="1324" alt="カスタム設定_Slack_Settings___Salesforce_-_Developer_Edition.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/2e296210-424a-1f50-8182-8f8495f73e21.png">

`Webhook URL`にコピーしたURLを貼り付けて保存します。

<img width="1324" alt="Slack_Settings___Salesforce_-_Developer_Edition.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/9212cc53-e4e2-fe0a-cd22-071ec741206f.png">

## 4. 通知メッセージ内のURLのインスタンスURLを変更

パッケージインストールすると新規リード通知のサンプルプロセスがインストールされます。
しかし、通知メッセージ内のURLが`ap2.salesforce.com`固定になっているので、環境に合わせて変更してください。

[作成]>[ワークフローと承認設定]>[プロセスビルダー]から、インストール済みの`LeadToSlackExample`を開いて、「コピー」ボタンをクリックしてください。

続いて、以下の赤枠のインスタンスURLを変更し、「Use this Formula」、「保存」をクリックします。

<img width="1325" alt="プロセスビルダー 7.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/f6191b00-ddbd-4e85-e4fc-454b2ffd44e0.png">

最後に「有効化」をクリックしてインストール完了です。

# どう動くの？

## パターン1: フォームから通知

Slack Messageオブジェクトを作成すると
（`Text`の書き方は、[Incoming Webhooks | Slack](https://api.slack.com/incoming-webhooks)を参照）

<img width="998" alt="スクリーンショット 2015-12-21 23.00.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/cddadc66-8cce-9f72-3e2d-22e96014fc2e.png">

Slackに通知が流れる。

<img width="914" alt="Slack.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/308597c5-3898-c681-4b94-dea053106db1.png">

## パターン2: プロセスビルダーで新規リードの通知

リードが作成されると（実際は問い合わせフォームとかから作られるけど）

<img width="1098" alt="リードの編集__新規リード___Salesforce_-_Developer_Edition_と_Slack_と_Force_com_開発者コンソール.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/93255b3b-c6f2-5234-9326-60a63ff77d68.png">

Slackに通知が流れる。

<img width="916" alt="Slack 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/37550db9-9004-933c-665c-daebc43b45f2.png">

なかなか便利！

# 通知の設定はどうするの？

先にパッケージをインストールしておいてください。

## 1. プロセスビルダーを作成

適当な名前をつけます。

- プロセス名: LeadToSlackExample
- API参照名: LeadToSlackExample

<img width="1324" alt="プロセスビルダー.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/25d9b6e6-e72c-341f-9f7b-ebbe56bb9e7e.png">

## 2. プロセスの開始タイミングを設定

- オブジェクト: リード
- プロセスを開始: レコードを作成した時のみ

<img width="1324" alt="プロセスビルダー 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/b4a7dac0-4e58-85d3-6b67-926824c4e97f.png">

## 3. 条件は特に設定しない

新規作成されたらいつでも通知したいので「アクションを実行する条件がない」を選択。

- 条件名: New Lead
- アクションの実行条件: アクションを実行する条件がない

<img width="1324" alt="プロセスビルダー 3.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/17e70120-264b-6030-f930-8492eef3bef7.png">

## 4. アクションを定義

Slack Messageオブジェクトをいい感じのメッセージで作成します。
`Text`項目に入れた文字列がSlackへの通知メッセージになりますので、例えば、数式は以下のように入力します。
数式でインスタンスURL取得するのは難しいので、`https://ap2.salesforce.com/`の箇所は修正してください。

- アクション種別: レコードを作成
- アクション名: Create Slack Message
- レコード: Slack Message
- 項目: Text
- 種別: 数式
- 値: 

```
"新規リード！" & BR() &
[Lead].Company & BR() &
[Lead].LastName & [Lead].FirstName & BR() &
[Lead].Email & BR() &
"https://ap2.salesforce.com/" & [Lead].Id
```

なお、デフォルトのchannelから通知先を変更したい場合は、Channelに設定してください。`#general`、`privatechannel`、`@directmessage`という感じに設定できます。
アイコンやBot名も変更できます。

詳しい設定は、[Incoming Webhooks | Slack](https://api.slack.com/incoming-webhooks)を参照してください。

<img width="1324" alt="プロセスビルダー 4.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/38d0346d-312a-4662-173b-efd04c33f15a.png">

## 5. プロセスを有効化

<img width="1324" alt="プロセスビルダー 5.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/ffa974fb-8392-ecd1-650b-21b0fec53157.png">

## 6. リードを作成すると、Slackに通知が来ます。

リードを作成すると、プロセスが実行され、Slack Messageが作成されます。
Slack Messageが作成されるとApexトリガが動作し、Slackに通知が送られます。

<img width="1098" alt="リードの編集__新規リード___Salesforce_-_Developer_Edition_と_Slack_と_Force_com_開発者コンソール.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/93255b3b-c6f2-5234-9326-60a63ff77d68.png">

Slackに通知が流れます。

<img width="916" alt="Slack 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/27267/37550db9-9004-933c-665c-daebc43b45f2.png">

こんな風にプロセスビルダーでできることは何でもSlackに通知できます。
商談が成約したらアイコンを :tada: にするとか、内容によって投稿先チャンネルを変えるとかもできますよ。

# まとめ

LeadやEventがリアルタイムに流れてくるだけでもとても便利！ぜひ使ってみてください。

[Attachments](https://api.slack.com/docs/attachments)なんかはまだ未対応なので、PRも歓迎です。ドキュメント皆無なのでその辺も歓迎です。

# 最後に宣伝

同じようにチャットとSalesforceをつなぐサービスを最近リリースしました。

![botdock.jpg](https://qiita-image-store.s3.amazonaws.com/0/27267/f7729573-4094-2100-e242-8c7615225342.jpeg)

[BotDock for Salesforce® | 株式会社co-meeting](http://www.co-meeting.co.jp/products/botdock-for-salesforce/)

よかったらご覧ください。
BotDockだと、ちゃんと認証してBotと対話式で活動の登録ができたりします。