hijikitaroのブログ

しがないSIerとして、日々プロジェクトを管理し、システムを育て、日々お子を見守り育てる中での出来事や学びを淡々と書いています。

Slack と Google Apps Script (GAS) を連携してMy英単語帳を作る。

少し前から英語を勉強するようになったこともあり、調べた英単語を残してあとで見返せるようにしたい、と思いちょっとしたアプリ?Bot?を作ってみたので、中身と作り方を簡易にまとめておく。

やったこと

やりたかったけど諦めたこと

  • 英語の品詞まで特定して返す
    • 英語辞書の良さげなAPIがなかった
    • 自然言語処理APIは文章となるので今回は外した。(今回は単語のみで扱いたかった)

なぜこの構成にしたのか

作成手順

SlackとGASの連携

  • Slack:チャンネル作成 My単語帳用の専用チャンネルの作成

  • Slack:Slackアプリの作成 外部APIと連携するためにカスタマイズSlackアプリの作成が必要(Slack Botと呼ばれているやつかと)

https://api.slack.com/start

  • My単語帳用の Slack Bot の作成(Bot User)
  • My単語帳用の Slack Bot の 「Installed App Settings」で Token の作成(※「Bot User OAuth Access Token」はGASで使用)

  • GAS:スクリプト作成

    • GASライブラリ「SlackApp」の追加

github.com

※無限ループするらしいので注意

  • Slack:Outgoing Webhook のアプリをインストール

ここまででSlackとGASが連携でき、SlackからのメッセージをGASへWebhook(POST)してGASで処理してSlackへWebhook(POST)してとなる。

翻訳とGoogleスプレッドシートへの登録

  • GAS:LanguageApp.translateを使って翻訳

developers.google.com

function translate(){
  var text = 'dog';
  var transVal = LanguageApp.translate(text, "en", "ja");
  Logger.log(transVal);
}
実行ログ
[19-12-28 22:36:38:199 JST] 犬
  // 値を設定するシートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('wordBook');
  // シートの最終行取得
  const LastRow = sheet.getLastRow();

  // 対象セルへ値をセット
  sheet.getRange(LastRow + 1,1).setValue(text);
  sheet.getRange(LastRow + 1,2).setValue(transVal);

※基本コピペの組み合わせ

// 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 から変更した方がよいのかも。

qiita.com

参考

qiita.com

tech.tabilabo.co.jp

qiita.com

tech-lab.sios.jp

qiita.com

www.sejuku.net