SlackBOTを作って、Slackを盛り上げよう
こんにちは、にゅ〜ぶるです。
少し前(いや、かなり前か…笑)に、こんなツイートをしました。
そうです!「にゅ〜ぶる会」に秘書が出来ました!!!
秘書と言っても、人ではなくて、SlackBOTなんですけどね…(人だと思った方すみません…💦)
今回は、SlackBOTの作り方を簡単にまとめて、皆さんのSlackにも適用されたら、いろんなところのSlackが盛り上がると嬉しいな!と思って記事にしています。
SlackBOTとは…?
一言で言うと、Slackで誰かが投稿した内容に自動で応答するアプリです。
作るのは難しいと思うかも知れませんが、実は簡単です。
必要なスキルは、
- スプレッドシート
- GAS(JavaScript)
- Slack
- ググる力
です!
では、順を追って説明していきますね。
Slackのアプリ設定にある「カスタムインテグレーション」に「Incoming Webhook」を追加します。
「インテグレーションの設定」は自由で良いです。
GAS側から、自由に変更出来るためです。ただし、実際に投稿されたアイコンをクリックした際などの情報は、ここで設定した情報が表示されるので、必要あれば変更ください。
ここで必要なのは、「WebhookURL」です。
このURLに情報をセットして呼び出すと、Slackに投稿されます。

GASでBOTの処理を作成します。
まずは、Slackへ投稿する処理を作りましょう。
簡単に言うと、投稿したい内容を用意して、UrlFetchApp.fetchを呼ぶだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var
INCOMING_URL
=
'ここに、IncomingのWebhookURLを貼り付けてください'; function
postSlackMsg(botName,
botIcon,
channel,
message)
{ var
payload =
{
'text' :
message, // 投稿内容 'username' :
botName, //botの名前 'icon_url' :
botIcon, //botのアイコン 'channel' :
channel, //投稿するチャンネル }; var
options
=
{
'method' :
'post', 'contentType'
:
'application/json', 'payload' :
JSON.stringify(payload), }; UrlFetchApp.fetch(INCOMING_URL,
options); } |
次は、Slackから受け取る側ですね。
受け取る関数は、doPost(e)です。Slackからこれが呼ばれるので、ここは固定にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function
doPost(e)
{ var
verifyToken
=
'ここに、Outgoingのトークンを貼り付けてください(後述)'; // 投稿の認証 if(verifyToken
!=
e.parameter.token){ throw
new
Error('トークン違う!'); } // 自分の投稿には反応しない(無限ループ対策) if(e.parameter.user_id
==
'USLACKBOT'){ throw
new
Error('無限ループダメ!絶対!'); } var
botName
=
'ぶるこ'; var
botIcon
=
'https://i.imgur.com/4gSmS8r.jpg'; // Trigger Words部分の削除(とりあえず4文字) var
triggerMsg
=
e.parameter.text.substr(4); var
replyMsg
=
searchMsg(triggerMsg); postSlackMsg(botName,
botIcon,
e.parameter.channel_id,
replyMsg); } |
途中に出て来ました「searchMsg」BOTの反応を決める関数です。
仕組みは、スプレッドシートの情報を抽出するようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// スプレッドからリプライを検索する function
searchMsg(triggerMsg)
{ var
replyMsg
=
''; if(triggerMsg
!=
''){ var
sheet =
SpreadsheetApp.openById('ここに、スプレッドシートのIDを貼り付けてください').getSheetByName('ここに、シート名を貼り付けてください'); var
lastRow
=
sheet.getLastRow(); for(var
row
=
2;
row
<=
lastRow;
row++)
{ // トリガー文字を含む場合はその行のリプライを選択 if(sheet.getRange(row,1).getValue().indexOf(triggerMsg)
!=
-1){ var
lastCol
=
findLastCol(sheet,
row); replyMsg
=
sheet.getRange(row,getRandomInt(2,
lastCol)).getValue(); break; } } } return
replyMsg; } |
途中に出てくる共通関数を、置いておきますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* * 指定行の「最終列の列番号」を返す * @param {number} 行番号 * @return {number} 最終列の列番号 */ function
findLastCol(sheet,
row)
{ // 指定の行を二次元配列に格納する ※シート全体の最終行までとする var
rowValues
=
sheet.getRange(row,
1,
1,
sheet.getLastColumn()).getValues(); //二次元配列を一次元配列に変換する RowValues
=
Array.prototype.concat.apply([],
RowValues); var
lastCol
=
RowValues.filter(String).length; return
lastCol; } |
1 2 3 4 5 6 7 8 9 10 |
/* * 乱数を返す * * @param {min} 最小値 * @param {max} 最大値 */
function
getRandomInt(min,
max)
{ var
ran
=
Math.floor(Math.random()
*
Math.floor(max
-
min
+
1)); return
min
+
ran;
} |
Slackのアプリ設定にある「カスタムインテグレーション」に「Outgoing Webhook」を追加します。
今度は、Slackの投稿情報をGASに連携するための設定です。
「インテグレーションの設定」は以下の通りです。

引き金となる言葉
このワードで始まる投稿に反応するようになります。BOTの名称にしておくと良いでしょう。
URL
GASの公開URLをここに設定してください。
トークン
どのSlackから呼ばれたかのキー情報になりますので、
このキーからのみ処理を動かすように、処理の先頭に追加しましょう。
※前術しましたdoPost(e)
の先頭でチェックします。
完成!?
実際に動かすと、こんな感じになります。

あとは、スプレッドシートの内容を充実化させていけば、いろいろなメッセージに自動応答していく事が可能になります。
まだまだ改善の余地があるプロジェクトになっていますが、最初のスタートとしてはこれぐらいで十分かなと思います。ソースコードや動きに疑問・質問等ありましたら、コメント等でご連絡頂けると助かります🙇♂️
ディスカッション
コメント一覧
まだ、コメントがありません