GASで娘botを作ってみた話
入社して3ヶ月が経過して、だいぶ身の回りの風景が見えてきたこともあり、最近はぼちぼちとルーティンの自動化に取り掛かっています。
POCは全社的にGSuiteを存分に使用していることもあって、とりあえずはGAS(Google App Script)で処理できる範囲での自動化を進めています。例えば下のケースではG SuiteとSlackのユーザ作成を一発でできるようにしました。ちゃんと計算したら工数(というかかかる時間)は9割減でした。
ということで、最近はちょっとGASづいていたわけです。
娘の言動が面白い
ところで、たぶんどこのお子さんもそうだと思いますが、子供の言動って面白いですよね。想定外のタイミングでとんでもないものをぶっ込んできたり、ノーモーションで鋭いツッコミを入れてきたり。別にこちらが教えたわけでもないのに、なんでこんなに面白いこと言えるんだろうなあといつも感心してしまいます。
我々夫婦は普段の情報連携をLINEではなくSlackでやっているのですが、この無機質な空間にふっと面白いことを言う娘が登場したらキラやば〜★(CV:成瀬瑛美)じゃない?と思ったのが作ってみるきっかけでした。
ぽこっと時間ができたタイミングで作ったところ、シンプルながらも色々な知見が得られたので、ここでひとつ作り方を紹介してみようと思います。
つくりかた
概要
このアプリの仕様をざっくり説明すると「定期的に、あらかじめ指定したSlackワークスペースの指定したチャンネルにて、スプレッドシートに登録された文字列をランダムに選択して喋るbot」です。
大まかなシーケンスはこんな感じ。GAS・スプレッドシート、そしてSlackと、登場人物もシンプルです。
下準備①:スプレッドシートの用意
娘の名言をスプレッドシートにがーっと書いておきます。この時、スプレッドシートの保護機能でA列以外に記入できないようにしておくと後々安全です。(このアプリの仕様的に)
下準備②:Slackトークンの取得
うちのSlackとGASを紐づけるために、Slackトークンを取得します。以前はとあるページに行けばトークンがいきなりもらえる仕様(レガシートークンという)でした※が、最近はきちんとアプリをワークスペースに登録しないとトークンがもらえないようになりました。
※ややこしくなるので、とりあえずレガシートークンはもう使えないという前提で話を進めます。
Slackにログインした状態で、Slack APIの「Your Apps」の「Create New App」をクリックし、アプリケーションを作成します。
任意のアプリ名を入力して、参加させたいワークスペースを選択したのちに「Create App」をクリックします。
次にどんな特徴のアプリなのかをSlackに登録します。今回は「Bots」を選択します。
その次に表示された画面で「Add a Bot User」をクリックした後、「Display Name」と「Default User Name」を入力します。後から変更できるのでここでは適当で構いません。「Always Show My Bot as Online」はOffのままで大丈夫です。(家族内のSlackなのでどっちでもいいですが)
全部入力できたら「Add Bot User」をクリックします。
ここまでできたらトークン取得まであと一息です。左側のメニューにある「OAuth & Permissions」をクリックし、「OAuth Tokens & Redirect URLs」内の「Install App to Workspace」ボタンをクリックします。本人確認画面が出るので、そのまま「許可する」で先に進んでください。
すると、さっき「Install App to Workspace」ボタンがあった場所に2つのトークンが出現するので、下の「Bot User OAuth Access Token」の方の文字列をコピペしてどこかに保管しておきましょう。
ようやくトークンが取得できました。
下準備③:Slackライブラリをスクリプトに登録
SlackをGASから扱えるようにするため、スクリプトにSlackのライブラリを登録します。※他の言語でプログラミングをする際のimportだとかrequireのイメージ
下準備①で作成したスプレッドシートのスクリプトエディタを開き(「ツール」>「スクリプトエディタ」)、「リソース」>「ライブラリ」を選択します。
ここにSlackのライブラリキー(M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO)をコピペしたのち、追加ボタンを押します。
バージョンは最新(開発当時は22)を指定して、左下の「保存」ボタンを押します。
これで下準備は完了です。いよいよコーディング!
コード
シンプルなアプリゆえ、コードも以下の通りシンプルです。スプレッドシートから値を取得する際に乱数を生成して、どの行の文字列を取得するかをランダムにしています。
var slackToken = '(さっき取得したslackのトークン文字列)';
function generateDaughter(){
//シートは一つしかないのでID指定の必要なし
var sheet = SpreadsheetApp.getActiveSheet();
//ランダムで喋らせるために都度乱数を生成
//1〜何らかの文字列が入力されているA列の最大行数の範囲
var rNum = Math.floor(Math.random()* sheet.getLastRow())+1;
//取得したトークンを引数にしてSlackオブジェクトを生成
var slackApp = SlackApp.create(slackToken);
//今回のケースでは#generalにて喋ってもらう
var channelId = '#general';
//スプレッドシートのA列x番目の言葉を代入
var message = sheet.getRange(rNum,1).getValue();
//botの名前を定義する
var options = {
//ここの名前を変更することで、Slackで表示する名前を変えられる
username:'むすめちゃん'
}
var res = slackApp.postMessage(channelId, message, options);
Logger.log(res);
}
トリガー設定
最後に起動するためのトリガーを設定します。今回は「2時間に1回自動で起動する」トリガーを設定します。スクリプトエディタの「編集」>「現在のトリガー」をクリックした後、画面右下の「トリガーを追加」をクリック。表示された画面で以下の通り設定します。
・実行する関数を選択:「generateDaughter」
・実行するデプロイを選択:「Head」
・イベントのソースを選択:「時間主導型」
・時間ベースのトリガーのタイプを選択:「時間ベースのタイマー」
・時間の間隔を選択(時間):「2時間おき」
「時間ベースのトリガーのタイプを選択」を「分ベースのタイマー」に変更すると分単位の設定が可能です。
これで完成!
娘が2時間おきに好き勝手に喋りまくっています。妻にもスプレッドシートの編集権限を渡して、表示候補となるリストは日々長くなっています。
このように夫婦間の会話にいきなり割り込んできて、ちくわ大明神的なおかしみを気軽に演出できるようになります。
車輪の再発明、だけど
というわけで、今回は超端的に言うと「GASで作るSlack bot」の作り方について書いてみました。こんなのは車輪の再発明もいいところですが、「よりよいインターネット」のためには結構大事なことなんじゃないかなと考えています。
どうしてそう思うかについてはまた別の機会として、今回はここまでとします。