はじめに
こんにちは、GMOインサイトのR.Kと申します。
今回、初めてテックブログに投稿させていただきました。
早速本題に入っていきます。
先日、初めてGAS(Google App Script)を業務で触り、Slackと連携してみて、「あ、これはすごく便利なやつだ」と確信しました。
GASを使うと簡単な方法でBotを作成することができたので、健康維持のために始めた筋トレのモチベーションを保つために、
SlackとGoogleスプレッドシートを使った簡単なシステムを作ろうと思います。
今回作るものの概要
名前:
筋トレ管理Bot
Botにやってほしいこと:
①筋トレ記録の入力促し
②筋トレ回数のスプレッドシートへの記録
③記録完了通知 + Botからの言葉をランダムに表示
システム概要
SlackとGoogleスプレッドシートを連携させるためにはいろいろと方法がありますが、今回はSlack apiのOutgoing Webhooks、 及び Incoming Webhooksを使います。
大まかな流れ:
Slack → Outgoing Webhooks → GAS → Incoming Webhooks → Slack
Outgoing Webhooks からSlackに入力された値をGASにポストし、GASでGoogleスプレッドシートへの書込み処理を行ったのち、Incoming Webhooksを使ってGASからのポストをSlackに表示します。
できたもの
・Slack
・Googleスプレッドシート(記録シート)
・Googleスプレッドシート(Botからの言葉シート)
実装の流れ
①Bot用のSlackチャンネルを作成する
チャンネルリストの上部にあるプラスボタンから作成できます。適当な名前を入力します。
②Botを作成
https://api.slack.com/slack-apps へアクセスし、「Create a Slack App」をクリックする。
App Name にBotの名前を入力し、Botを用いるワークスペースを指定する。
終わったら「Create App」をクリックする。
③Incoming Webhooksを設定する
features>Incoming Webhooks に遷移し、Activate Incoming Webhooks をOnにする。
その後、ページ下部のAdd New Webhook to WorkSpace をクリックし、承認画面が開くので許可ボタンをクリックする。
Webhook URL がページ下部に表示されるのでコピーしておく。
(後で、GASのスクリプト作成の際に用いるため。)
④筋トレ管理用のGoogleスプレッドシートを作成する
適当なスプレッドシートを作成してください。
⑤GASのスクリプトを作成する
メニューのツールからスクリプトエディタをクリックする。
エディタが開くので、動かしたいコードを書いて保存する。
※今回作成したGASスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
function postSlack(text){ var url = "https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXX"; var options = { "method" : "POST", "headers": {"Content-type": "application/json"}, "payload" : '{"text":"' + text + '"}' }; UrlFetchApp.fetch(url, options); } // 指定した時間にSlackにメッセージをポストする function doMessage(e) { var message = "こんにちは!\n今日は筋トレしたかな?\n`腕立て`,`腹筋`,`スクワット`の回数をスペースで区切って入力してね"; postSlack(message); } // Slackからの入力を受け取る function doPost(e) { if (e.parameter.user_name === "slackbot") return; var data = e.parameter.text.split(" ");//今回はサクッと作ったのでデータのチェックは一旦保留 record(data); //Slackへ筋トレ管理botからのコメントをポスト postSlack("入力完了!\n筋トレ管理botからのコメント:「" + selectRemark() + "」"); } function record (data) { var recordsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('記録'); // 記録シートを取得; var lastrow = recordsheet.getLastRow(); var recordrow = lastrow + 1; var date = new Date(); var formatdate = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd'); var lastrecorddate = recordsheet.getRange("A" + lastrow).getValue(); var formatlastrecorddate = Utilities.formatDate(lastrecorddate, 'Asia/Tokyo', 'yyyy/MM/dd'); if (formatdate == formatlastrecorddate) { recordrow = lastrow; } //最終行の次の行に入力する recordsheet.getRange("A" + recordrow).setValue(formatdate); recordsheet.getRange("B" + recordrow).setValue(data[0]); recordsheet.getRange("C" + recordrow).setValue(data[1]); recordsheet.getRange("D" + recordrow).setValue(data[2]); } function selectRemark () { var remarksheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('言葉');// 言葉シートを取得; var random = Math.round( Math.random() * remarksheet.getLastRow()); var remark = remarksheet.getRange("A" + random).getValue(); return remark; } |
Slackからの入力内容を受け取る箇所のバリデーション処理などについては、今回はサンプルコードなので省略します。
⑥GASスクリプトを公開アプリケーションに設定
メニューの公開から「ウェブアプリケーションとして導入」をクリック。
更新後、ウェブアプリケーションのURLが表示されるのでコピーしておいてください。
⑦SlackApiの Outgoing Webhooks を 入れる
https://(自分のワークスペース名).slack.com/apps/manage にアクセスする。
OutgoingWebhooksを検索し、出てきたポップアップをクリックする。
アプリの紹介画面に遷移するので、「設定する」をクリックすると設定画面が表示される。
⑧Outgoing WebhooksのIntegration Settingsで各設定をする
Botを使いたいチャンネルを選択し、URL欄に⑥でコピーしたURLをコピペする。
今回はトリガーワードは設定しないので「引き金となる言葉」は空欄にする。
設定を保存するをクリック。
⑨Slackへの通知を設定
GASの編集画面のメニューから「編集」をクリックし、「現在のプロジェクトのトリガー」をクリックする。
GASの管理画面が開くので、右下の「トリガーを追加」をクリックする。
上記の画面が開くので、イベント発火したい関数とその条件を登録する。
今回は、日ごとに一回、特定の時間にSlackへ通知したいので、「イベントのソースを選択」を時間主導型に設定。
⑩完成
ここまでやれば、一通り完成です。
Botを使うようにしてから、筋トレ回数の記録を自然と行うようになりましたので皆さんも活用してみてください。