SalesforceからSlackに通知を飛ばす【Apex】

eyeglasses on top of a laptop Apex
Photo by Mikhail Nilov on Pexels.com

最近以下のような要望を実現することがあったので記事にします。

  • レコードの作成・更新時に、特定のチャンネル・ユーザに対して、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 を買収済みであるため、今後さらに簡単な連携方法が公式から出る可能性があります。

コメント

タイトルとURLをコピーしました