logo-sm

お問い合わせは Webフォームから

ブログ

Slackを利用した「いいね」をカウントするBotの実装

2018.07.14

こんにちは、去年の7月よりアウルキャンプで働いている@hondaです。

現在当社ではSlackを利用してタイムカードの記録や、社内の各種連絡などを行っています。

今回のブログでは、当社で利用しているSlackに「いいね!」と付けた回数を集計するBotを追加する方法を紹介します。

このBotを利用することで「いいね!」された数をカウントして、誰がどのくらい感謝されているかを確認する事ができるようになります。

 

 

前提条件

  • Slackのアカウントを持っていること
  • Googleのアカウントを持っていること

 

Botは以下の手順で追加します。

1.GoogleAppsScript(GAS)の導入

2.Scriptファイルの作成

3.WebアプリケーションURLの取得

4.スクリプトプロパティの登録

5.Webアプリケーションの更新

6.動作確認

 

1.GoogleAppsScript(GAS)の導入

Googleドライブの画面で右クリックし、その他→アプリを追加を選択します。

右上の検索窓より「google apps script」と検索します。

「+接続」をクリックして、アプリを追加します。

 

2.Scriptファイルの作成

Googleドライブの画面で右クリックし、その他→Google Apps Script(GAS)を選択します。

GASが起動したら、Botを使用するためのライブラリを導入します。

  ※ライブラリとは、他の人が作成して公開した関数を自分のプロジェクトで使用できる機能のことです。

上部メニューより、リソース→ライブラリを選択します。

以下のライブラリキーを入力して追加する(バージョンは「22」を選択)

M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO

このライブラリは、@soundTrickerさんの

Slack BotをGASでいい感じで書くためのライブラリを作った

を使用しています。

 

ライブラリに追加されたら、下記の図のように開いている「コード.gs」に「記載コード」を入力し、保存します。

(下記のGASでは、iine_count.jsonという名前で保存しています)

コードの内容については、Innovator Japan Engineers’ Blogさんの

「感謝の気持ち」をストックして可視化するSlackBotを作ってみた

を参考にしました。

記載コード

***


//変数の宣言
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;

}

***

 

3.WebアプリケーションURLの取得

GASのメニューより公開→Webアプリケーションとして導入を選択します。

Webアプリケーションとして導入の画面で以下のように設定を行います。

「許可を承認」を選択します。

「許可」を選択します。

WebアプリケーションのURLが表示されたら、URLを控えておきます。

 

4.スクリプトプロパティの登録

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件のプロパティを下記のように全て登録したら、「保存」を選択します。

 

 

5.Webアプリケーションの更新

GASのメニューより公開→ウェブ アプリケーションとして導入を選択します。

「プロジェクトバージョン」を「新規作成」に変更し、「更新」を選択します。

一旦すべてのブラウザを閉じ、再度Slackにログインします。

 

6.動作確認

Slackにて以下のコマンドを実行し、誰かに「いいね」を付与する事が出来ます。

●いいね付与コマンド ⇒ 「ユーザ1いいねの付与」が返ってきます。※自分にはできません

iine @ユーザ名 コメント

●ランキング確認コマンド ⇒「いいね」を付与された人がランキング形式で表示されます。

iine ranking

設定したスプレッドシートの record には「いいね」と「コメント」が記録され、

member には「いいね」が付与された人とその回数が集計されます。

集計された「いいね」については、slack でのランキング確認コマンドでも確認出来ます。

  

 

 

如何でしたでしょうか。

SlackはG Suiteと連携して、チャットツールに様々な機能を付与することができます。

これを読んでいる方も、是非Bot実装に挑戦してみてください。

関連記事

  • WindowsのWSL2上のDockerでup時に’ContainerConfig’のエラーが出た。
    当社の開発環境はMacとWindowsが混在したDocker上での開発を行っています。なのでMacでOKだけど […]

    2024.04.08

  • VSCode (内のPowerShell)でアドレス設定を切り替え!
    【経緯】 最近携わった案件で大量のNW機器のキッティングをした際、それぞれにSSHでの接続性などを確認するテス […]

    2023.10.13

  • PaloaltoでWindows NTPサーバに同期
    【事象と対処法】 オフライン環境のPaloaltoでNTPの機能確認をする必要があり、Windows標準のNT […]

    2023.10.13

  • パートナー

  • 人材育成・採用情報