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の準備
リモートサイトの準備
設定画面のクイック検索から「リモートサイトサイトの設定画面」を開きます
新規リモートサイトをクリックします
リモートサイト名
→適当な名前で大丈夫です
リモートサイトのURL
→「 https://hooks.slack.com 」と入力します
Apexクラスの準備

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の名前やアイコンなのでお好みで設定してください
プロセスビルダーの準備

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



オブジェクトをクリック後、オブジェクトを選択します
「フィード項目」を選択します
プロセスの開始トリガーを選択します
chatterを投稿したときのみ か 投稿または編集したとき かを選択します
今回は「作成または編集」を選択し保存します


条件を追加をクリックします
今回はトリガーを「chatterを投稿または編集したとき」に設定しているため、
「アクションを実行する条件がない」を選択し、保存します
アクションを追加します
アクション種別
→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から送信されました
商談名
投稿メッセージ
ファイル添付があります
設定が完了したら保存ボタンを押します
最後に有効化をクリックします
動作確認
chatterに投稿して、Slackへ転送されていれば完成です!
案内
後編ではSlackの転送時にメンションをつけたり複数のチャンネルへ転送する方法を紹介しています
https://qiita.com/SyogoSuganoya/items/e7ebbaae571baae03a41
参考
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