Skip to content

tkfmst/slack-command-create-channel

Repository files navigation

slack-command-create-channel

概要

SlackのSlash Command用バックエンドAPIとして動作する

  • 新チャネル作成
  • ユーザーorユーザーグループをまとめて招待

GAS(GoogleAppsScript)にデプロイできるように作成している (factoryしているgasのcomponentを入れ替えれば他でも一応使えるはず)

動作

trigger

doPost

Install & Deploy

  1. claspをグローバルインストール
    • // claspをグローバルインストール
      yarn global add clasp
      // Log inしておく
      clasp login
  2. GCPプロジェクトのロギングを使う設定
    1. GCPプロジェクトを新規作成
      • 既存のでもOK
    2. APIとサービスのOAuth同意画面を設定
    3. 公開ステータスを公開に設定
    4. プロジェクト情報にあるプロジェクト番号を控えておく
  3. AppsScriptの設定
    1. 新しいプロジェクトを作成
    2. 設定からGCPプロジェクトを変更で、先ほどコピーしたプロジェクト番号を設定
    3. AppsScriptの設定からスクリプトIDをコピーしておく
    4. https://script.google.com/home/usersettingsをONにする
  4. AppsScriptにソースをpushする
    1. ソースをclone
      • git@github.com:tkfmst/slack-command-create-channel.git
        cd slack-command-create-channel
    2. npmパッケージをインストール
      • yarn install
    3. .clasp.json にAppsScriptのスクリプトIDを設定する(要確認)
      • オプションなしでclasp push するとGASに新規プロジェクトが作られる
    4. ソースをAppsScriptにpush
      • yarn build
        clasp push
        
  5. Slackでbot tokenを作成
  6. Slackでslash commandを作り、botを許可しておく
  7. Slackで作ったAppをworkspaceにinstallする
    • 管理者許可が必要
  8. Slackのbot tokenをAppsSriptに設定する
    • スクリプトプロパティにTOKENというキーで設定する
    • 以下のようなtoken設定用の関数を作り実行する
      • function setVal(){
            PropertiesService.getScriptProperties().setProperty('TOKEN', 'xxxxxxxxxxxxxxxxxxxxxxx');
            // 確認
            Logger.log(PropertiesService.getScriptProperties().getProperty("TOKEN"));
        }�
        
  9. 新しく作るSlackチャンネルのベースとなる名前をAppsScriptに設定する
    • スクリプトプロパティにBASENAMEというキーで設定する
    • 以下のようなtoken設定用の関数を作り実行する
      • function setVal(){
            PropertiesService.getScriptProperties().setProperty('BASENAME', 'xxxxxxxxxxxxxxxxxxxxxxx');
            // 確認
            Logger.log(PropertiesService.getScriptProperties().getProperty("BASENAME"));
        }�
        
  10. AppsScriptでOAuth設定
    • 設定画面でdoPostを選んで実行を押すと認証設定が出る
      • スクリプトはパラメタ不足のerror情報が出て失敗する
      • GCPプロジェクトロギングにもログが出ている事を確認する
  11. AppsScriptでデプロイする
    • ウェブアプリで、アクセスできるユーザーは全員で設定する
    • 全員にしないとSlack側からアクセスできない
    • URLをコピーする
  12. AppsScriptのトリガー設定で、trigger メソッドを選択して定時実行させる
  13. Slackのslash commandにデプロイしたウェブアプリのURLを設定しておく
  14. commandを実行して通れば完了
    • エラーの時はログを確認する

よくあるQ&A

Slack

  • Q. slash command打ったらdispatch_failedと出る
    • A. commandに設定したURLが200 OKを返してない
    • A. curlなどで確認してみる。3xxでもNG
    • A. AppsScriptでデプロイを新しく作り直してみる
  • Q. slash command打ったらtimeout が返ってくる
    • A. 3000ms以上だとそうなる。slack仕様。
    • A. ロジックを工夫する。api何度も叩くようなのは非同期実行する
      • 今回はユーザーデータ、グループデータはtriggerで別に取得するようにした
      • 多分GASだと非同期にしてもrootなメソッド(これだとdoPost)は終わらないぽいので非同期できない
  • Q. ユーザーグループ名がリクエストボディからうまく取得できない
    • A. グループは<!subteam^S0AAAAA0A|@usergroup_name>のようなテキストで入ってくるので、パースする必要がある

GAS

  • Q. clasp createで作ったAppsScriptだとGCPプロジェクトを変更できない事がある
    • A. GAS側で新規プロジェクトで作る
  • Q. clasp pushでエラーになる
  • Q. doPostのログが確認できない
    • A. GCPプロジェクトと紐づけて、ロギングを見る必要がある
    • A. ロギングはテストのまま使うにはテストユーザーを登録する必要がある
  • Q. GASからHTTPリクエストできない
    • A. http requestはUrlFetchAppを使う
      • scope https://www.googleapis.com/auth/script.external_request を許可する必要がある
    • A. webpackすれば他のnpmも使えるかもしれないが未検証
  • Q. GAS実行時の権限設定でエラー表示になる
    • A. GCPプロジェクトのOAuth同意画面で公開ステータスが本番環境になっている必要がある
    • A. テスト ならテストユーザーに登録する

GAS written with typescript

  • Q. import * as X from './xxx' エイリアスが読めない
    • A. GASではすべてのクラスがフラットな状態で存在するので実際の名前を全部指定する必要がある
    • A. また同じ名前のexportは競合するので使えない
    • A. webpackする
  • Q. eslint, tsc, babel, webpack全部通るのにアップロードするとエラーになる
    • A. ときどきある。諦めて書きかえる
      • ts2gasをきちんと見ればわかるかも

その他

  • Q. GAS webappについて
    • A. webappとかapiはデバッグに時間がかかる
      • ローカルである程度変換してもclaspで変換されたものが動作するかはデプロイするまで分からない
    • A. 1,2ファイルで終わるシンプルなもの、spredsheetやdrive使う場合以外はサーバ立てた方が楽に思う

TODO

  • テスト書く

About

slack command用: create channel + invite multi users

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors