0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Salesforce Apex SDK for Slackの使い方3 Slack解析アプリを作ってみる

Last updated at Posted at 2022-07-14

オリジナルのアプリを作っていきましょう。

今回作るアプリ

今回は、SlackのpostをSalesforceに記録するアプリケーションを作ってみたいと思います。
これができると何が捗るかと言うと、誰がどのチャンネルでどれくらい発言しているかとか、それに対して返信がどの程度あるかといった情報をSalesforceのレポートで解析できるようになります。

Salesforce側にオブジェクトを作る

2つのカスタムオブジェクトを作成します

  • Slack Channels
  • Slack Posts

です。

Slack_Channels__c

チャンネル側はシンプルです

Slack_Channels___Salesforce.png

Slack_Posts__c

Posts側は少し項目が増えます

Slack_Posts___Salesforce.png

主従関係でSlack Channelを参照しています

Apexアプリを作ろう

これは、前回のものを流用しましょう。

ここで書いた、無限ループしてしまうやつを応用します。

classes/EventDispatcherEventExample.cls
            } else if (event instanceof Slack.MessageEvent) {
                Slack.MessageEvent messageEvent = (Slack.MessageEvent) event;
                channelId = messageEvent.getChannel();
                LIST<Slack_Channels__c> channels = new LIST<Slack_Channels__c>();
                channels = [SELECT ID, Channel_ID__c FROM Slack_Channels__c WHERE Channel_ID__c = :channelId];
                String channel_sfid;
                if(channels.size()==0){
                    Slack_Channels__c add_channel = new Slack_Channels__c(Name = channelId, Channel_ID__c = channelId);
                    insert add_channel;
                    channel_sfid = add_channel.id;
                }else{
                    channel_sfid = channels[0].id;
                }
                String msg_text = messageEvent.getText();
                String EventTs = messageEvent.getEventTs();
                String Ts = messageEvent.getTs();
                String ThreadTs = messageEvent.getThreadTs();
                String slackUserID = messageEvent.getUser();
                Slack_Posts__c newpost = new Slack_Posts__c(Slack_Channels__c = channel_sfid, Slack_User_ID__c = slackUserID, Text__c = msg_text, Ts__c = Ts);
                if(ThreadTs!=NULL){
                    newpost.ThreadTs__c = ThreadTs;
                    LIST<Slack_Posts__c> parents = new LIST<Slack_Posts__c>();
                    parents = [SELECT ID FROM Slack_Posts__c WHERE Slack_Channels__c = :channel_sfid AND Ts__c = :ThreadTs];
                    if(parents.size()>0){
                        newpost.Parent_post__c = parents[0].id;
                    }
                }
                insert newpost;

            }
            /* これ入れるとアプリが反応してチャンネルにpostしまくってしまうのでコメントアウトしておきます
            Slack.ChatPostMessageResponse response = botClient.chatPostMessage(
                Slack.ChatPostMessageRequest.builder().channel(channelId).text(text).build()
            );

            if (response.getError() != null) {
                System.debug(response.getResponseMetadata().getMessages());
            }
            */

ということで完成です。シンプルですね。

試してみましょう

アプリが入ってるチャンネルでなにか発言をしてみます。
続いて、スレッドにコメントを入れてみましょう。

Slack_____05-george___Leave_a_Nest_Co__ltd____1_個の新しいアイテム.png

うまく行っていれば、これがそのままSalesforce側に同期されます。
見てみましょう。

Salesforce 側のレコードを見てみる

すべて選択___Slack_Channels___Salesforce.png

Channel IDが保存されています。
本当はName欄にはチャンネル名を取得して入れたかったのですが、やり方が分からなかったので今回はIDを入れちゃってます。
それでは待望のPostはどうでしょう。

すべて選択___Slack_Posts___Salesforce.png

はい。こんな感じになりました。
スレッド内のコメントの場合はParent post欄にリンクが貼られています。
text欄はビューで見ると改行コードが抜けて見えますが、レコード側を開くと改行されていることが分かります。

Post-0007___Salesforce.png

オプション事項

  • チャンネル名を取得する方法が分かったらChannels__c.Name にはチャンネル名を入れたい
  • アプリのホーム画面に、公開チャンネル全てにjoinするボタンを作って、それが押されたらアプリが全チャンネルに入るようにする必要がある
  • Slack のユーザーIDからユーザーを検索してメールアドレスを取得する事ができれば、それを使ってpostの所有者をそのユーザーに変更する処理が書けるのだが、ユーザー情報の取得方法が今の所不明

注意点

メッセージイベントはSalesforceの開発者コンソールにログが流れないみたいです。
デバッグが出来ませんのでご注意ください。
こんなのログに流しちゃったら開発者コンソール死んじゃうよなと思ってたのですが、そもそも表示しないという選択になっていたのか…なるほどね。

まとめ

ということで、実はこのアプリ自体は、以前にSlackアプリとして作成したもので、Heroku上にデータを蓄積し、そのデータをTableauで解析するという仕組みになっていました。
Salesforce Apex SDK for Slackを使うことでHerokuにおくアプリが不要になります。
実装自体は、デバッグが出来ないくらいですが中身が簡単なのでなんとかなっちゃいました。
以上です!

関連リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?