自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

相談用プライベートチャンネル自動生成 GASでSlackのスラッシュコマンド(前編)

shanaiho.smarthr.co.jp 会社の同僚からこんなのをやりたいとURL付きのチャットが来たので、GASで実装できるか検証してみます。

最終目標

  1. 所定のスラッシュコマンドを実行する
  2. プライベートチャンネルを生成
  3. プライベートチャンネルに実行ユーザと固定ユーザを追加
  4. チャンネルの案内メッセージを返す

というのを作るんですが…そもそもSlackのSlash Commandを作ったことがないので前編ではどんな風にGASに対してリクエストを送信できるのかを実験。 まずはSlash Commandを実行すると送信したリクエスト内容をそのまま返すだけの機能を作ってみます。

Google Apps Script を作成

ここでは「SlackSlashCommand」という名前でスプレッドシートを用意。(なんでもいいです)

「ツール」>「スクリプトエディタ」とたどって、GASの開発環境を開く。 f:id:maru0014:20210116194322p:plain

プロジェクト名もスプレッドシートに合わせておきました。

f:id:maru0014:20210116194330p:plain

まずは動作テスト用に以下のように書きます。※書いたあと保存を忘れずに

function doPost(e) {
  const result = JSON.stringify(e);
  return ContentService.createTextOutput(result);
}

右上の「デプロイ」ボタンから「新しいデプロイ」を選択。

f:id:maru0014:20210116194353p:plain

歯車アイコンから「ウェブアプリ」を選択。

f:id:maru0014:20210116194402p:plain

アクセスできるユーザーは「全員」にして「デプロイ」します。「自分のみ」にするとGoogleアカウントでの認証が必要になってしまうのでSlackからのリクエストが受信できないためです。 ※今回はテストのみなので省略しますが、実運用時にはトークンの一致で認証させます。

f:id:maru0014:20210116194409p:plain

表示されたURLがSlackからGASへのリクエスト送信先になるのでコピーしておきましょう。

f:id:maru0014:20210116194421p:plain

Slack Apps を作成

https://api.slack.com/apps にアクセスして「Create New App」をクリック。

f:id:maru0014:20210116194507p:plain

App Nameと対象ワークスペースを指定。ここではGASというAppNameでプライベートWorkspaceに対して作成する。「Create App」で保存。

f:id:maru0014:20210116194512p:plain

Slash Commands を作成

アプリの設定画面左側にある「Slash Commands」を開いて「Create New Command」をクリック

f:id:maru0014:20210116194520p:plain

コマンドの作成画面で以下のとおり設定。

Command ... /任意の文字列

Request URL ... 先程コピーしたGASのURL

Short Description ... コマンドの説明文

右下の「Save」ボタンで保存します。

f:id:maru0014:20210116194541p:plain

アプリをWorkspaceにインストール

Slack App は作成や設定変更したあとに Install App することで実際のSlack環境に反映されます。

左メニューの「Install App」>「Install to Workspace」をクリック。

f:id:maru0014:20210116194553p:plain

確認画面が表示されるので「許可する」

f:id:maru0014:20210116194604p:plain

実験

これでAppに「GAS」が追加されて /test コマンドが利用可能になります。

テスト結果はこんなかんじ。実行したコマンドやユーザーなど様々な情報が送信されていることがわかります。GASではこれらの情報をもとにチャンネルに追加するユーザを決めたりするわけですね。

f:id:maru0014:20210116194614p:plain

まとめ

  • Slash Commandを作るのはわりと簡単
  • LambdaとかなくてもGASで実装可能

ただ、今後出てくると思いますがSlackは3秒以内にレスポンスが無いとリクエストを再試行するという仕様があるのでチャンネル作成→ユーザ追加→チャンネル案内をやろうとするとその制限に引っかかる気がします。

対策としてはcacheサービスにジョブキューを持たせて擬似的な非同期処理を行うというものがあるので、チャンネルが複数作られちゃうみたいなことが発生するようなら試してみようと思います。

次回の後編では実際にチャンネルの作成、メンバーの追加処理を実装します。

codelife.cafe