Slack と Google Apps Script (GAS) を連携してMy英単語帳を作る。
少し前から英語を勉強するようになったこともあり、調べた英単語を残してあとで見返せるようにしたい、と思いちょっとしたアプリ?Bot?を作ってみたので、中身と作り方を簡易にまとめておく。
やったこと
- Slackで投稿した単語をGoogle Apps Script (以下、GASと呼ぶ)へ連携し、単語と翻訳をGoogleスプレッドシートへ登録、かつ、Slackへ返す。
やりたかったけど諦めたこと
なぜこの構成にしたのか
作成手順
SlackとGASの連携
Slack:チャンネル作成 My単語帳用の専用チャンネルの作成
Slack:Slackアプリの作成 外部APIと連携するためにカスタマイズSlackアプリの作成が必要(Slack Botと呼ばれているやつかと)
- My単語帳用の Slack Bot の作成(Bot User)
My単語帳用の Slack Bot の 「Installed App Settings」で Token の作成(※「Bot User OAuth Access Token」はGASで使用)
GAS:スクリプト作成
- GASライブラリ「SlackApp」の追加
※無限ループするらしいので注意
- Slack:Outgoing Webhook のアプリをインストール
- Slackのワークスペースに内に追加するアプリ(外部アプリ)
ここまででSlackとGASが連携でき、SlackからのメッセージをGASへWebhook(POST)してGASで処理してSlackへWebhook(POST)してとなる。
翻訳とGoogleスプレッドシートへの登録
- GAS:LanguageApp.translateを使って翻訳
function translate(){ var text = 'dog'; var transVal = LanguageApp.translate(text, "en", "ja"); Logger.log(transVal); }
実行ログ [19-12-28 22:36:38:199 JST] 犬
- GAS:スプレッドシートへ値をセット
// 値を設定するシートを取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('wordBook'); // シートの最終行取得 const LastRow = sheet.getLastRow(); // 対象セルへ値をセット sheet.getRange(LastRow + 1,1).setValue(text); sheet.getRange(LastRow + 1,2).setValue(transVal);
- GAS:最終的なスクリプト
※基本コピペの組み合わせ
// Bot User OAuth Access Token をSLACK_TOKENに格納します。 var SLACK_TOKEN = "******"; // Outgoing Webhooks設定画面で表示されるTokenをWEBHOOK_TOKENに格納します。 var WEBHOOK_TOKEN = "*******"; // doPost関数はエンドポイントにPOSTで届いた情報をキャッチする関数のことです(GASのデフォルト関数) function doPost(e) { // eにはPOSTされた投稿情報が格納されています。 // 注意:下記if文は無限ループを回避する為のものです。e.parameter.user_nameが"slackbot"以外の時のみ次の処理を行います。 // outgoing webhooksの設定でトリガーを指定していない場合、slackAPPからslackに行う投稿(後述)もGASにPOSTされてしまいます。 // その投稿情報のe.parameter.user_nameは必ず"slackbot"になります。その為、user_nameが"slackbot"じゃない時のみ処理します。 // ※SlackAppでSlackに投稿する際、投稿するユーザー名を自由に決められる(後述)ので、parameter.user_nameも指定したユーザー名になるかと思いきや、必ず"slackbot"という値になリます。 // トリガーを設定しない場合は必ず設定してください。 if (e.parameter.user_name != "slackbot"){ postMessage(e.parameter.token, e.parameter.text); } } //Post massage(Slackに投稿する関数) var postMessage = function(webhook_token, text){ // POSTされたwebhook_tokenと、設定したOutgoing Webhooksのwebhook_tokenを照合し、異なる場合はエラーを通知します。 // GASのendpointを知られてしまい、勝手にGASにPOSTされた場合への対処です。 if (WEBHOOK_TOKEN != webhook_token) { throw new Error("invalid token."); //エラーを通知します } // PropertiesService:https://developers.google.com/apps-script/reference/properties/ PropertiesService.getScriptProperties().setProperty("token", SLACK_TOKEN); var prop = PropertiesService.getScriptProperties().getProperties(); // slackAppライブラリを利用してslackに投稿 var slackApp = SlackApp.create(prop.token); // 対象チャンネル var channelId = "#****"; // 投稿するメッセージ var message = registerMyWord(text); var options = { } slackApp.postMessage(channelId, message, options); return null; } // 単語の登録と翻訳 var registerMyWord = function(text){ var val = text; // 英語から日本語へ翻訳 var transVal = LanguageApp.translate(text, "en", "ja"); // 値を設定するシートを取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('wordBook'); // シートの最終行取得 const LastRow = sheet.getLastRow(); // 対象セルへ値をセット sheet.getRange(LastRow + 1,1).setValue(text); sheet.getRange(LastRow + 1,2).setValue(transVal); return text + '\n' + transVal; }
おわりに
初めて作ったので、ちょっとしたことでつまづいてしまったが、わかればかなり簡単にSlack Botが作成できる。今回作成したMy単語帳のデータがたまったら、データを分析し、わからない単語の傾向や品詞の傾向などがつかめればよいなと思っている。
また、Slack Bot の作成として、下記記事のように Outgoing WebHooks から変更した方がよいのかも。