SlackのSlash Command用バックエンドAPIとして動作する
- 新チャネル作成
- ユーザーorユーザーグループをまとめて招待
GAS(GoogleAppsScript)にデプロイできるように作成している (factoryしているgasのcomponentを入れ替えれば他でも一応使えるはず)
- claspをグローバルインストール
-
// claspをグローバルインストール yarn global add clasp // Log inしておく clasp login
-
- GCPプロジェクトのロギングを使う設定
- GCPプロジェクトを新規作成
- 既存のでもOK
- APIとサービスのOAuth同意画面を設定
- 公開ステータスを公開に設定
- プロジェクト情報にあるプロジェクト番号を控えておく
- GCPプロジェクトを新規作成
- AppsScriptの設定
- 新しいプロジェクトを作成
- 設定からGCPプロジェクトを変更で、先ほどコピーしたプロジェクト番号を設定
- AppsScriptの設定からスクリプトIDをコピーしておく
- https://script.google.com/home/usersettingsをONにする
- AppsScriptにソースをpushする
- ソースをclone
-
git@github.com:tkfmst/slack-command-create-channel.git cd slack-command-create-channel
-
- npmパッケージをインストール
-
yarn install
-
.clasp.jsonにAppsScriptのスクリプトIDを設定する(要確認)- オプションなしで
clasp pushするとGASに新規プロジェクトが作られる
- オプションなしで
- ソースをAppsScriptにpush
-
yarn build clasp push
-
- ソースをclone
- Slackでbot tokenを作成
- Appを作成し、以下のAPIで利用するOAuth scopeを許可する
- bot tokenを取得しておく
- Slackでslash commandを作り、botを許可しておく
- Slackで作ったAppをworkspaceにinstallする
- 管理者許可が必要
- Slackのbot tokenをAppsSriptに設定する
- スクリプトプロパティに
TOKENというキーで設定する - 以下のようなtoken設定用の関数を作り実行する
-
function setVal(){ PropertiesService.getScriptProperties().setProperty('TOKEN', 'xxxxxxxxxxxxxxxxxxxxxxx'); // 確認 Logger.log(PropertiesService.getScriptProperties().getProperty("TOKEN")); }�
-
- スクリプトプロパティに
- 新しく作るSlackチャンネルのベースとなる名前をAppsScriptに設定する
- スクリプトプロパティに
BASENAMEというキーで設定する - 以下のようなtoken設定用の関数を作り実行する
-
function setVal(){ PropertiesService.getScriptProperties().setProperty('BASENAME', 'xxxxxxxxxxxxxxxxxxxxxxx'); // 確認 Logger.log(PropertiesService.getScriptProperties().getProperty("BASENAME")); }�
-
- スクリプトプロパティに
- AppsScriptでOAuth設定
- 設定画面で
doPostを選んで実行を押すと認証設定が出る- スクリプトはパラメタ不足のerror情報が出て失敗する
- GCPプロジェクトロギングにもログが出ている事を確認する
- 設定画面で
- AppsScriptでデプロイする
- ウェブアプリで、アクセスできるユーザーは全員で設定する
- 全員にしないとSlack側からアクセスできない
- URLをコピーする
- AppsScriptのトリガー設定で、
triggerメソッドを選択して定時実行させる - Slackのslash commandにデプロイしたウェブアプリのURLを設定しておく
- commandを実行して通れば完了
- エラーの時はログを確認する
- 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>のようなテキストで入ってくるので、パースする必要がある
- A. グループは
- Q. clasp createで作ったAppsScriptだとGCPプロジェクトを変更できない事がある
- A. GAS側で新規プロジェクトで作る
- Q. clasp pushでエラーになる
- A. エラーメッセージにある説明にだいたいURL書いていてそこにアクセスすれば解決する
- A. https://script.google.com/home/usersettingsの設定がOFFだと権限で弾かれる
- Q. doPostのログが確認できない
- A. GCPプロジェクトと紐づけて、ロギングを見る必要がある
- A. ロギングはテストのまま使うにはテストユーザーを登録する必要がある
- Q. GASからHTTPリクエストできない
- A. http requestはUrlFetchAppを使う
- scope
https://www.googleapis.com/auth/script.external_requestを許可する必要がある
- scope
- A. webpackすれば他のnpmも使えるかもしれないが未検証
- A. http requestはUrlFetchAppを使う
- Q. GAS実行時の権限設定でエラー表示になる
- A. GCPプロジェクトのOAuth同意画面で公開ステータスが
本番環境になっている必要がある - A.
テストならテストユーザーに登録する
- A. GCPプロジェクトのOAuth同意画面で公開ステータスが
- Q.
import * as X from './xxx'エイリアスが読めない- A. GASではすべてのクラスがフラットな状態で存在するので実際の名前を全部指定する必要がある
- A. また同じ名前のexportは競合するので使えない
- A. webpackする
- Q. eslint, tsc, babel, webpack全部通るのにアップロードするとエラーになる
- A. ときどきある。諦めて書きかえる
- ts2gasをきちんと見ればわかるかも
- A. ときどきある。諦めて書きかえる
- Q. GAS webappについて
- A. webappとかapiはデバッグに時間がかかる
- ローカルである程度変換してもclaspで変換されたものが動作するかはデプロイするまで分からない
- A. 1,2ファイルで終わるシンプルなもの、spredsheetやdrive使う場合以外はサーバ立てた方が楽に思う
- A. webappとかapiはデバッグに時間がかかる
- テスト書く

