takafumi blog

日々の勉強メモ

Slackのチャネル作成+ユーザー(&グループ)複数をまとめて招待できるコマンドをGAS+typescriptで作った

typescript 4.2.3

Slackで新チャンネルを作るときに、ユーザーもまとめて招待できるコマンドを作成してみた。 チャンネル名はある程度固定で使う事を想定した。

また(だいぶ前から) claspがtypescriptをサポートしていたので書いてみた

・・・が割とコードが膨大になったので、結局webpackしてアップロードするようにしたので、あまりtypescriptのサポートは関係なくなってしまった

github.com

最初はペラっと1,2ファイルのつもりだったのをガリガリ拡張したので、ちょっと雑になってしまった

コードはgithubを見てもらうとして、作っている途中に引っかかったところを書いてみる。

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使う場合以外はサーバ立てた方が楽に思う