最近以下のような要望を実現することがあったので記事にします。
- レコードの作成・更新時に、特定のチャンネル・ユーザに対して、Slack でメッセージを送信したい
Zapier を使う等のやり方もあるのですが、
今回は Slack Webhook + Apex クラス + Apex トリガ で実現しました。
事前準備
今回のやり方では、Webhook URL を使用します。
この Webhook URL に POSTリクエストをするだけで、Slack に投稿することができます。
以下を参考に、Webhook URL を取得します。
Slack での Incoming Webhook の利用
Slack 通知用の Apex クラスの作成
次に、Slack 通知用の Apex クラスを作成します。
public with sharing class SlackNotification {
private String channel; // 投稿するチャンネルのID(DMの場合、ユーザID)
private String text = ''; // 本文
public SlackNotification(String channel) {
this.channel = channel;
}
public void addUserMention(String slackUserId){
text += '<@' + slackUserId + '>\n';
}
public void addUserGroupMention(String slackUserGroupId){
text += '<!subteam^' + slackUserGroupId + '>\n';
}
public void addMessage(String message){
text += message;
}
public void addRecordLink(Id recordId, String linkText){
text += '<' + Url.getOrgDomainUrl().toExternalForm() + '/lightning/r/' + recordId + '/view|' + linkText + '>';
}
public void send(){
JSONGenerator gen = JSON.createGenerator(true);
gen.writeStartObject();
gen.writeStringField('channel', channel);
gen.writeStringField('text', text);
gen.writeEndObject();
sendHttpRequest(gen.getAsString());
}
// トリガから呼び出せるようにするため、コールアウト部分を @future で分離
@future(callout=true)
private static void sendHttpRequest(String body){
HttpRequest request = new HttpRequest();
request.setEndpoint('事前準備で取得した Webhook URL');
request.setMethod('POST');
request.setHeader('Content-Type','application/json');
request.setBody(body);
Http http = new Http();
HttpResponse res = http.send(request);
System.debug(res);
}
}
Apexトリガ からの呼び出し
先ほど作成した SlackNotification クラスを Apex トリガ から呼び出します。
trigger AccountTrigger on Account (after update){
AccountTriggerHandler handler = new AccountTriggerHandler();
if(Trigger.isAfter && Trigger.isUpdate){
handler.notifySlack(Trigger.new);
}
}
public with sharing class AccountTriggerHandler {
@future(callout=true)
private static void notifySlack(List<Account> newList){
for(Account acc : newList){
SlackNotification sn = new SlackNotification('SlackチャンネルのId');
sn.addUserMention('メンションするユーザのSlackID');
sn.addRecordLink(acc.Id, 'これ');
sn.addMessage('が更新されたレコードです!');
sn.send();
}
}
}
まとめ
今回は Webhook URL を使用して Salesforce から Slack に通知を飛ばす方法を紹介しました。
※ Salesforce が Slack を買収済みであるため、今後さらに簡単な連携方法が公式から出る可能性があります。
コメント