チャットツールのSlackとGAS(Google Apps Script)を使って、特定のキーワードに反応してジェダイの師ヨーダがメッセージを返してくれるBotを作ってみた。息抜きや人生に迷った時にメッセージを賜りたいと思う。

必要なもの

  • Slack
  • Googleスプレッドシート
  • GAS(Google Apps Script)

もちろん全て無料。

(1)Slack側の準備

SlackからGASにトリガーを送信する準備をする。

(1-1)Outgoing WebHooksの設定

1) メニュー > Apps & Integrations

2) Outgoing WebHooksをインストールしてSettingsページに移る

slack webhook select image

3) どのチャンネルにどんなワードで呼び出されるかの設定を行う

slack webhook setting image
  • Channel = とりあえず #general を選ぶ
  • Trigger Word(s) = どの言葉でヨーダを呼び出すかの設定 ※あえてたまに使われそうなワードをトリガーにしておいて、予期せぬ時にヨーダが出てきても面白い(頻度が多いとうざがられる)
  • URL(s) = ひとまず空欄。後で公開したGASサーバーのURLを入力する

上記以外は空欄でOKなので、Save Settingsする

(1-2)SlackのAPI Toakenを発行する

1) Slack Authentificationにアクセス
2) ページ下部のGenerate test tokenをクリック
3) Test token generatorのページでCreate tokenをクリック

slack webhook setting image

(2)ヨーダの名言を準備する

以下、今回のために準備した名言集。マスター・ヨーダは名言しか吐かない。
英語の抽象的な言い回しは何となく人生の真理のようなものを含んでいる気がする。

  • No! Try not. Do. Or do not. There is no try.
  • May the Force be with you.
  • Death is a natural part of life.
  • Use the force. Feel it.
  • Great warrior? Wars not make one great.
  • Here, between you… me… the tree… the rock… everywhere!
  • You must unlearn what you have learned.
  • Truly wonderful the mind of a child is.
  • Judge me by my size, do you?
  • No different. Only different in your mind.
  • Always with you it cannot be done.
  • Luminous beings are we, not this crude matter.
  • Too sure of themselves they are.
  • A Jedi uses the Force for knowledge and defense, never for attack.
  • You will know, when you are calm, at peace, passive.

スプレッドシートを新規作成し、A列のセルに貼り付ける。
※ランダムで毎回1つの名言を抽出するために、B列は空欄にしておく

google spreadsheet word list

(3)Google Apps Script(GAS)でスクリプトを書く

先ほどのスプレッドシートから、
ツール > スクリプトエディタ
を開く。

(3-1)ソースコードを書く

まず全スプリプト。結構短く済む。


function doPost(y) {
var token = PropertiesService.getScriptProperties().getProperty("xoxp-abcd");
var name = "Yoda - Master BOT";
var icon = "https://dl.dropboxusercontent.com/u/9957528/icons/yoda.png";
var app = SlackApp.create(token);
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('シート1');
var range = sheet.getRange("シート1!B1").setFormula('=INDIRECT("シート1!A:A" & INT(RAND()*15+1))');
var message = sheet.getRange("シート1!B1").getValue();
return app.postMessage("#general", message, {
username: name,
icon_url: icon
});
}

一応コードの説明を書くと、

  • `doPost` : Google側が用意してくれた関数。
  • `token` : getProperty()の中に、先ほどSlackで取得したアクセストークンを書く。クォーテーションで囲むのを忘れずに
  • `name` : slackに投稿したユーザー名(任意)
  • `icon` : 表示したいアイコン画像のURL(任意)
  • `spreadsheet` : 現在使用中のスプレッドシートを自動取得
  • `sheet` : どのシートを使うかの指定
  • `range` : setFormulaで15の名言の中から今回吐き出す名言をランダムで1つ選び出し、B1に記入している。15はセルの数。
  • `message` : rangeで入力された値を抽出している

(3-2)GASにSlackライブラリをインストール

GAS側でSlackにポストするライブラリをインストールする。

1) リソース > ライブラリ

2) ライブラリでSlackの下記ライブラリキーを検索
M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO

3) SlackAppのデベロッパーモードを「有効」にする

4) バージョンは最新のものを選ぶ

5) >保存して閉じる

google spreadsheet word list

(4)スクリプトをWEBアプリとして公開する

今回は定期ではなくslackからのリクエストに応じて都度botを起動するので、Webサーバーとして公開されている必要がある。GASなら無料。素晴らしい。

1) 公開 > ウェブアプリケーションとして導入
2) プロジェクトバージョン = 版の管理。編集するたびに版も変えるのが無難。
3) アプリケーションにアクセスできるユーザー = 全員 にする
4) 更新する
5) 初回のみ認証許可を尋ねられるので、許可。

google spreadsheet word list

(5)Slackから呼び出してみる

準備が整ったので、Slackの #general で「Yoda:」と入力してみる。

google spreadsheet word list

成功! 何度か試してみると毎回ランダムな名言が返される。


個人的にスターウォーズが好きなのでヨーダを登場させてみたけど、担当者やチームの好みによって、MCUでもポケモンでもなんでもいい。

遊び心がわからないおっさんのいるチャットでは無論使ってはいけない。