ブログ
Slackを利用した「いいね」をカウントするBotの実装
こんにちは、去年の7月よりアウルキャンプで働いている@hondaです。
現在当社ではSlackを利用してタイムカードの記録や、社内の各種連絡などを行っています。
今回のブログでは、当社で利用しているSlackに「いいね!」と付けた回数を集計するBotを追加する方法を紹介します。
このBotを利用することで「いいね!」された数をカウントして、誰がどのくらい感謝されているかを確認する事ができるようになります。
Botは以下の手順で追加します。
1.GoogleAppsScript(GAS)の導入
2.Scriptファイルの作成
3.WebアプリケーションURLの取得
4.スクリプトプロパティの登録
5.Webアプリケーションの更新
6.動作確認
Googleドライブの画面で右クリックし、その他→アプリを追加を選択します。
右上の検索窓より「google apps script」と検索します。
「+接続」をクリックして、アプリを追加します。
Googleドライブの画面で右クリックし、その他→Google Apps Script(GAS)を選択します。
GASが起動したら、Botを使用するためのライブラリを導入します。
※ライブラリとは、他の人が作成して公開した関数を自分のプロジェクトで使用できる機能のことです。
上部メニューより、リソース→ライブラリを選択します。
以下のライブラリキーを入力して追加する(バージョンは「22」を選択)
M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO
このライブラリは、@soundTrickerさんの
を使用しています。
ライブラリに追加されたら、下記の図のように開いている「コード.gs」に「記載コード」を入力し、保存します。
(下記のGASでは、iine_count.jsonという名前で保存しています)
コードの内容については、Innovator Japan Engineers’ Blogさんの
を参考にしました。
記載コード
***
//変数の宣言
var SLACK_API_TOKEN = PropertiesService.getScriptProperties().getProperty('SLACK_API_TOKEN');
var OUTGOING_TOKEN = PropertiesService.getScriptProperties().getProperty('OUTGOING_TOKEN');
var SPREADSHEET_ID = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID');
var RECORD_SHEET_NAME = 'record';
var MEMBER_SHEET_NAME = 'member';
function doPost(e) {
if(OUTGOING_TOKEN == e.parameter.token && e.parameter.trigger_word == 'iine'){
var slackApp = SlackApp.create(SLACK_API_TOKEN);
var ss = SpreadsheetApp.openById(SPREADSHEET_ID);
if(!ss.getSheetByName(MEMBER_SHEET_NAME)) slackApp.chatPostMessage(e.parameter.channel_id, 'iine_bot起動', {username : 'iine_bot',icon_emoji : ':+1:' });
var record_sheet = getRecordSheet(ss);
var member_sheet = getMemberSheet(ss);
// ランキング表示
if(e.parameter.text.match(/^iine ranking$/)){
slackApp.chatPostMessage(e.parameter.channel_id, getRanking(member_sheet), {username : 'iine_bot',icon_emoji : ':+1:' });
return;
}
var iine_params = e.parameter.text.match(/^iine <\@(.*)>(.*)/);
if(iine_params == null) return;
var user_info = slackApp.usersInfo(iine_params[1]);
if(!user_info['ok']) return;
var iine_target = user_info['user']['name'];
// 自分自身へのいいねを禁止
if(iine_target == e.parameter.user_name ) {
slackApp.chatPostMessage(e.parameter.channel_id, '自分に いいね はできません', {username : 'iine_bot',icon_emoji : ':+1:' });
return;
}
// botの返信メッセージ
var iine_message = iine_params[2].replace(/(^\s+)|(\s+$)/g, "");
var last_row = member_sheet.getLastRow();
var tmp_user = '';
for( i = 2 ; i <= last_row ; i++ ){
tmp_user = member_sheet.getRange('A' + i ).getValue();
if(iine_target == tmp_user){
record_sheet.appendRow([new Date(),e.parameter.user_name,iine_target,iine_message]);
slackApp.chatPostMessage(e.parameter.channel_id, iine_target + 'に 1 いいね付与 (合計:' + member_sheet.getRange('B' + i).getValue() + ' いいね)', {username : 'iine_bot',icon_emoji : ':+1:' });
break;
}
}
}
}
// 履歴リストのシートを取得
function getRecordSheet(ss){
var sheet = ss.getSheetByName(RECORD_SHEET_NAME);
// 履歴リストのシートがない場合は生成
if(!sheet) {
sheet = ss.insertSheet(RECORD_SHEET_NAME);
sheet.setColumnWidth(1, 130);
sheet.setColumnWidth(4, 500);
sheet.getRange('A1:D1').setBackground('#036');
sheet.getRange('A1:D1').setFontColor('#FFF');
sheet.getRange('A1').setValue('いつ');
sheet.getRange('B1').setValue('誰が');
sheet.getRange('C1').setValue('誰に');
sheet.getRange('D1').setValue('メッセージ');
sheet.getRange('D1').setWrap(true);
sheet.getRange('A:D').setBorder(true, true, true, true, true, true);
}
return sheet;
}
// メンバーリストのシートを取得
function getMemberSheet(ss){
var sheet = ss.getSheetByName(MEMBER_SHEET_NAME);
// メンバーリストのシートがない場合は生成
if(!sheet) {
sheet = ss.insertSheet(MEMBER_SHEET_NAME);
resetMembers(sheet);
}
return sheet;
}
// メンバーリストの設定
function resetMembers(sheet){
sheet.getRange('A:C').clear();
sheet.getRange('A1:C1').setBackground('#036');
sheet.getRange('A1:C1').setFontColor('#FFF');
sheet.getRange('A1').setValue('メンバー');
sheet.getRange('B1').setValue('いいねされた数');
sheet.getRange('C1').setValue('いいねした数');
sheet.getRange('A:C').setBorder(true, true, true, true, true, true);
var userList = SlackApp.create(SLACK_API_TOKEN).usersList();
var user;
var line = 2;
for(var i = 0;i<userList.members.length;i++) {
user = userList.members[i];
if(!user.deleted) {
sheet.getRange(line, 1).setValue(user.name);
sheet.getRange(line, 2).setValue('=COUNTIF(' + RECORD_SHEET_NAME + '!C:C,A' + line + ')');
sheet.getRange(line, 3).setValue('=COUNTIF(' + RECORD_SHEET_NAME + '!B:B,A' + line + ')');
line += 1;
}
}
}
// ランキングの取得
function getRanking(sheet){
var ranking_text = '';
var range = sheet.getRange("A:C");
range.sort([{column: 2, ascending: false},{column: 3, ascending: false}, {column: 1, ascending: true}]);
var user = '';
var iine = '';
var tmp_iine = '';
var disp_rank = '';
var last_row = sheet.getLastRow();
for( i = 2 ; i <= last_row ; i++ ){
user = sheet.getRange('A' + i ).getValue();
iine = sheet.getRange('B' + i ).getValue();
if (iine == 0) return ranking_text;
if(iine != tmp_iine){
disp_rank = i - 1;
}
ranking_text = ranking_text + disp_rank + '位 ' + user + ' (' + iine + 'いいね)\r\n';
tmp_iine = iine;
}
return ranking_text;
}
***
GASのメニューより公開→Webアプリケーションとして導入を選択します。
Webアプリケーションとして導入の画面で以下のように設定を行います。
「許可を承認」を選択します。
「許可」を選択します。
WebアプリケーションのURLが表示されたら、URLを控えておきます。
3種類のスクリプトを登録します。
●SLACK_API_TOKEN : Bot本体の設定を指定します
●OUTGOING_TOKEN : Slack上で指定したキーワードの投稿をGASへ送信するAPPを指定します
●SPREADSHEET_ID : いいねの回数を記録するスプレッドシートを指定します
SLACK_API_TOKEN
Slackのトップ画面からAppを選択し、「Bots」を検索して選択します。
Usernameを設定します。
「API Token」が表示されたら、控えておきます。
OUTGOING_TOKEN
Slackのトップ画面からAppを選択します。
「Outgoing WebHooks」を検索して選択します。
発信Webフックが表示されるので選択します。
発信Webフックインテグレーションの追加を選択します。
インテグレーションの設定を以下のように設定を行います。
●チャンネル : 全チャンネル
●引き金となる言葉 : iine
●URL : WebアプリケーションURL
●トークン : トークンの内容は控えておきます。
一番下の設定を保存を選択します。
SPREADSHEET_ID
Googleスプレッドシートを新規作成します。
URLの●の部分を控えておきます。
{{unknown}}
3件のスクリプトプロパティの追加
GASの画面に戻り、「ファイル」→「プロジェクトのプロパティ」を選択します。
「スクリプトのプロパティ」タグにて「+行を追加」を選択し、
プロパティに「SLACK_API_TOKEN」、「値」に先程控えた「API Token」を入力します。
もう一度「+行を追加」を選択し、
プロパティを「OUTGOING_TOKEN」、「値」に先程控えた「トークン」を入力します。
再度「+行を追加」を選択し、
プロパティを「SPREADSHEET_ID」、「値」に先程控えた「●●●●●●●●●」を入力します。
3件のプロパティを下記のように全て登録したら、「保存」を選択します。
GASのメニューより公開→ウェブ アプリケーションとして導入を選択します。
「プロジェクトバージョン」を「新規作成」に変更し、「更新」を選択します。
一旦すべてのブラウザを閉じ、再度Slackにログインします。
Slackにて以下のコマンドを実行し、誰かに「いいね」を付与する事が出来ます。
●いいね付与コマンド ⇒ 「ユーザ1いいねの付与」が返ってきます。※自分にはできません
iine @ユーザ名 コメント
●ランキング確認コマンド ⇒「いいね」を付与された人がランキング形式で表示されます。
iine ranking
設定したスプレッドシートの record には「いいね」と「コメント」が記録され、
member には「いいね」が付与された人とその回数が集計されます。
集計された「いいね」については、slack でのランキング確認コマンドでも確認出来ます。
如何でしたでしょうか。
SlackはG Suiteと連携して、チャットツールに様々な機能を付与することができます。
これを読んでいる方も、是非Bot実装に挑戦してみてください。
関連記事
2024.09.30
2024.09.30
2024.04.08