yuji0602’s blog

日々思っていることなど。

SlackのスラッシュコマンドとGoogleスプレッドシートでランチに行くお店をランダムで表示する

だいぶ前にSlackのランチbotを作ったなというのを思い出して、今度はSlackのスラッシュコマンドを使って同じようなものを作ってみようと思いました。
botでいいじゃんという話もありそうな気がしますが、お金が潤沢にある会社ではないので、過去にbotを動かしていたサーバを停止していて、今はそのbotを動かすようなサーバが無いのでスラッシュコマンドの方にシフトチェンジしました。

Slackのスラッシュコマンドを叩くとGoogleスプレッドシートに紐づくGoogle Apps Script(GAS)が反応して結果を戻すものを作成したというのが今回の内容です。

GoogleスプレッドシートやGASで作ろうと思った意図

Googleスプレッドシートにしておくと何が良いかというと、こんな感じでしょうか。

  • 共有しておけば誰でもスプレッドシートにお店情報を足せる
  • お店が移転・閉店してしまった場合のメンテナンスが出来る(多分
  • 作ったプログラムをキッカケに他のアイディアが出てくるのを期待している

では早速作ったものを書いていきます。

設定について

作るのにさしあたって、設定周りについてはこちらのリンクを参考にさせて頂きました。本当に助かりました。感謝です。

tbpgr.hatenablog.com

完成イメージ

スラッシュコマンドを入力するとこんな感じで表示されます。(Slackのチーム名は消してます)

f:id:yuji0602:20171223234355p:plain

実際に叩くとこんな感じで表示されます。タバコを吸う人、タバコ吸えるお店が嫌な人向けにその辺も表示しようと思いました。

f:id:yuji0602:20171223232725p:plain

管理するスプレッドシートはこんな感じです。

f:id:yuji0602:20171223232735p:plain

店名、URL、喫煙、その他という項目にしてみました。

作成したプログラム

Googleスプレッドシートスクリプトエディタには以下のようなコードを書いてみました。

スプレッドシートのシート名はlunchにしています。
SLACK_VERIFY_TOKENについてはスクリプトエディタのプロパティに設定しています。

/**
 * スプレッドシートから値を取得して値を返却
 */
function doPost(e) {
  // トークンの確認
  var verifyToken = PropertiesService.getScriptProperties().getProperty('SLACK_VERIFY_TOKEN')
  if (verifyToken != e.parameter.token) {
    throw new Error("invalid token.");
  }

  // スプレッドシートの値を取得
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadSheet.getSheetByName('lunch');

  // ランダムでシートの1行取得する
  var startRow = 4;
  var startCol = 1;
  var numRows = 1;
  var getRow = Math.floor((Math.random() * ((sheet.getLastRow() + 1) - startRow)) + startRow);
  var sheetData = sheet.getRange(getRow, startCol, numRows, sheet.getLastColumn()).getValues();

  // スラッシュコマンドの引数を取得
  var isChannel = "ephemeral";
  if (e.parameter.text === '1') {
      isChannel = "in_channel";
  }

  var params = {
    name: sheetData[0][0],
    url: sheetData[0][1],
    smoke: sheetData[0][2],
    etc: sheetData[0][3],
    isChannel: isChannel
  };

  // Slackに表示するメッセージを設定
  var res = getMessageObject_(params);

  // Slackに結果を返却
  return ContentService.createTextOutput(JSON.stringify(res)).setMimeType(ContentService.MimeType.JSON);
}

/**
 * Slack送信する為のオブジェクトを作成
 */
function getMessageObject_(parameters) {
  return {
    response_type: parameters.isChannel,
    attachments: [{
      "color": "#ededed",
      "fields": [
        {
          "title": "店名",
          "value": parameters.name,
          "short": "true"
        },
        {
          "title": "URL",
          "value": parameters.url,
          "short": "true"
        },
        {
          "title": "喫煙",
          "value": parameters.smoke,
          "short": "true"
        },
        {
          "title": "その他",
          "value": parameters.etc,
          "short": "true"
        }
      ]
    }]
  };
}

課題

スラッシュコマンドは3秒を越えるとエラーとなってしまいます。GASで書いているプログラムはまあまあな頻度でエラーになってしまうのが悩ましいところです。

まとめ

今回はSlackのスラッシュコマンドとGASを使ったものを作成してみました。結構簡単に動くものを作ることが出来たので楽しかったです。エラーになる頻度がもう少し落ちると良いなと思いつつ、もう少し効率の良いものを書いてみようかなと思いました。

それでは今日はこの辺で。おやすみなさい。