chatterからSlackへ転送する(前編)

chatterの内容をSlackへ転送する方法を紹介します
この章ではchatterの投稿文をあらかじめ指定したSlackの宛先に転送する方法を紹介しています

後編ではSlackの転送時にメンションをつけたり複数のチャンネルへ転送する方法を紹介しています
https://qiita.com/SyogoSuganoya/items/e7ebbaae571baae03a41


# 前準備
こちらの記事を参考にSlackへIncoming Webhookを設定します

【Slack】SlackでBotを開発する方法【GAS】
https://qiita.com/SyogoSuganoya/items/bb6a4f5256c0e944a0f5

# SFの準備
## リモートサイトの準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/37fa1922-5ddc-383a-bcf0-8405527a5b8c.png)
設定画面のクイック検索から「リモートサイトサイトの設定画面」を開きます

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/8a79d2d4-db4e-dfaa-d1bd-a713da08e8d9.png)

新規リモートサイトをクリックします

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/d7ad0259-9001-f3d1-aab2-abf51cd2145e.png)

リモートサイト名
　→適当な名前で大丈夫です
リモートサイトのURL
　→「 https://hooks.slack.com 」と入力します

## Apexクラスの準備
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/113f18b8-d4bd-df19-a09e-b262847f3701.png" width="200px">
設定画面のクイック検索から「Apexクラス」を開きます

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/2eabd50c-b10a-42eb-6f90-9d4988778fb4.png)
新規作成します

```Apex:publishToSlackBasic
public class publishToSlackBasic{

    public class slackRequest { 
        @InvocableVariable(label='Slack Message' required=true) 
        public String slackMessage; 
        @InvocableVariable(label='Channel/User to post to' required=true) 
        public String channel; 
    } 

    @InvocableMethod(label='Publish to Slack')
    public static void publishToSlack(List<slackRequest> requests) {
        String webhookURL='ここにwebhockURLを入力する'; 
        for(slackRequest r:requests){
            JSONGenerator gen = JSON.createGenerator(true);
            gen.writeStartObject(); //Inserts {
            gen.writeStringField('text', r.slackMessage);
            gen.writeStringField('channel', r.channel);
            gen.writeStringField('username', 'Salesforce Bot');
            gen.writeStringField('icon_emoji', ':sf:');
            gen.writeEndObject(); //Inserts }

            String body = gen.getAsString(); //Translates JSONGenerator to string to be passed to callout
            System.debug(body);
            System.enqueueJob(new qCallOut(webhookURL, 'POST', body));
        } 
    }

    public class qCallOut implements System.Queueable, Database.AllowsCallouts {

        private final String url;
        private final String method;
        private final String body;

        public qCallOut(String url, String method, String body) {
            this.url = url;
            this.method = method;
            this.body = body;
        }

        public void execute(System.QueueableContext ctx) {
            HttpRequest req = new HttpRequest();
            req.setEndpoint(url);
            req.setMethod(method);
            req.setBody(body);
            Http http = new Http();
            HttpResponse res = http.send(req);
        }
    }
}
```
`String webhookURL='ここにwebhockURLを入力する'; `の部分は自身の環境に合わせてください

`gen.writeStringField('username', 'Salesforce Bot');`
`gen.writeStringField('icon_emoji', ':sf:');`
この部分はbotの名前やアイコンなのでお好みで設定してください
## プロセスビルダーの準備
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/d2b55ef3-6ccd-9718-0976-b4fb718aa9f6.png" width="200px">
設定画面のクイック検索から「プロセスビルダー」を開きます

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/00475465-34bd-e90d-b6b7-a53fc521d0d6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/0253e9dc-6428-313e-30ba-d0f52cc23ea1.png)

新規ボタンクリック後、新規プロセス情報を入力します
プロセス名
　→適当な名前で大丈夫です
API参照名
　→適当な名前で大丈夫です
プロセスを開始するタイミング
　→「レコードが変更されたとき」に設定します

---
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/ba46eccd-d282-1a83-804e-dcf4bf2e1b3e.png" width="300px">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/e1a558f8-812f-92c1-3398-f140d6c9748f.png" width="400px">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/3bfd5f2a-b965-cfe6-5c64-99e2bba352a9.png" width="300px">

オブジェクトをクリック後、オブジェクトを選択します
「フィード項目」を選択します

プロセスの開始トリガーを選択します
chatterを投稿したときのみ か 投稿または編集したとき かを選択します
今回は「作成または編集」を選択し保存します

---
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/e00958d1-b797-b197-fd0a-3f372e93be98.png" width="300px">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/96b1a321-9f8e-31c1-2a2e-ff54756c5637.png" width="300px">

条件を追加をクリックします
今回はトリガーを「chatterを投稿または編集したとき」に設定しているため、
「アクションを実行する条件がない」を選択し、保存します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/d07d02c4-f32d-4e5a-5c3c-4faac6a747eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/bad4ab7a-58cc-3688-c677-6e50a1d3d109.png)

アクションを追加します
アクション種別
　→Apex
アクション名
　→適当な名前で大丈夫です
Apexクラス
　→Publish to Slack

Slack Message
　→Slackへ送信する文字列を設定できます
Channel/User to post to
　→Slackの宛先を設定できます


---

chatterの内容は[FeedItem].Bodyに保存されています
chatterメッセージをそのまま転送するにはSlack Messageに以下を設定します
種別
　→数式
値
　→[FeedItem].Body

ただこのままではpタグがそのままSlackへ出力されてしまうので、
値を以下のように変更すると出力文が自然な見た目になります
(pタグを改行に置換する処理です)
値
　→`SUBSTITUTE(SUBSTITUTE([FeedItem].Body, "</p>", BR()) , "<p>", "") `

---
また、以下のような出力フォーマットを設定できます

ファイル投稿の時「ファイル添付があります」と転送したい
　→`if([FeedItem].HasContent,"ファイル添付があります","")`

商談名の出力
　→`[FeedItem].Parent:Opportunity.Name`

---

設定例を以下に記します

```
【Slack Message】
"chatterから送信されました" + BR() + 
[FeedItem].Parent:Opportunity.Name + BR() + 
SUBSTITUTE(SUBSTITUTE([FeedItem].Body, "</p>", BR()) , "<p>", "") + BR() + 

if([FeedItem].HasContent,"ファイル添付があります","")
```

```
【Slackへ出力される文章】
chatterから送信されました
商談名
投稿メッセージ

ファイル添付があります
```

設定が完了したら保存ボタンを押します

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/f888bdda-d4a6-0a81-4864-671ddad838bc.png)

最後に有効化をクリックします

# 動作確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/8a9a8d43-2db5-0ab7-3d91-e96bd37f19c7.png)

chatterに投稿して、Slackへ転送されていれば完成です！

# 案内
後編ではSlackの転送時にメンションをつけたり複数のチャンネルへ転送する方法を紹介しています
https://qiita.com/SyogoSuganoya/items/e7ebbaae571baae03a41
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/b02a686a-2833-569f-93c0-3dcaf015550e.png)



# 参考
salesforceでレコードが登録されたらslackに通知を送る方法
https://blog.intracker.net/archives/2018

Salesforce および Lightning プラットフォームのオブジェクトリファレンス「FeedItem」
https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_feeditem.htm