Slackのプライベートチャンネルに誰かを追加する時、権限さえあればそのまま招待できます。それが問題になる場面があります。「担当者が勝手に人を入れてしまった」「誰が承認したのか分からない」というやつです。
ある案件でこの課題が出ました。解決策は単純で、招待の前に一度止めるステップを挟む仕組みを作ることです。申請→承認者へDM通知→承認後に招待実行という流れです。Slackにはこれが標準で入っていないので、作ります。
仕組みの全体像
申請者がフォームで申請
↓
承認担当者のSlackにDM通知(承認・否認ボタン付き)
↓ 承認
対象チャンネルに招待実行 + 申請者に結果通知
↓ 否認
申請者に否認通知(否認者名とコメント付き)
承認の記録はGoogleスプレッドシートに残します。データベースを別途用意せず、スプシで十分です。
AIへの頼み方
私はコードを手書きしません。最初に別のAIツールが出してきたコード案を持って、こんな感じで整理を依頼しました。
Slackのプライベートチャンネルへの招待に、承認のステップを挟みたい。
- 誰かが招待を申請したら、承認担当者のSlackにDMが届く
- DMに「承認」「否認」ボタンを付ける
- 承認されたら実際に招待APIを呼ぶ。否認されたら申請者にその旨を通知する
- 承認者リストと申請記録はGoogleスプレッドシートで管理したい(データベースは使いたくない)
- Netlifyのサーバーレス関数で動かす
「データベース使いたくない、スプシで何とかならん」というのが最初の問い直しです。AIは最初にデータベースを提案してきましたが、スプレッドシートで十分な規模感だったので変えてもらいました。
詰まった所と対処
デプロイしてなかった
手順通りに組んで、実際に招待を試みたのに無反応でした。原因はシンプルで、デプロイしていなかっただけです。てへぺろ、という感じですが、こういうミスはあります。デプロイ後にSlack側の接続検証が通るかどうか確認する手順を先に確認しておくと良かったです。
承認者にDMが届かない
デプロイして動いているのに、承認担当者のSlackにDMが届かないという問題が出ました。これはSlack Appに付与している権限が不足していたためです。チャットメッセージを送るための権限(im:write など)が抜けていました。
Slack Appに必要な権限の設定は、ボットトークンのスコープとして管理画面で追加します。どの操作にどの権限が要るかはSlackの管理画面のエラーや公式ドキュメントで確認できますが、最初に権限一覧をまとめてAIに確認させておくほうが早いです。
タイムアウト
ボタンを押してから処理結果が返るまでに時間がかかると、Slack側でタイムアウトになります。Slackはボタン操作に対して3秒以内のレスポンスを要求しています。招待処理やスプシへの書き込みが重なると遅くなることがあります。
対処としては、まず即時に「処理中」のレスポンスを返して、実際の処理は非同期で走らせる構成にします。AIに「ボタン操作への即時応答と、実際の処理を分けて」と頼むと構成を提案してもらえます。
否認した時に「承認者」と表示されていた
通知メッセージの中で、否認の場合も「承認者」という表記のままになっていました。小さいバグですが、受け取った側は混乱します。「否認した時は否認者という表記にしてほしい」とAIに伝えたら直りました。このくらいの細かい修正はやり取りしながら潰せます。
コメント欄のタイミング
最初の実装では、承認・否認のボタンを押した後にコメント入力のモーダル(ポップアップ画面)が開く仕様でした。ただ「承認の依頼が届いた時点でコメント欄も一緒に見えていたほうがいい」という話になり、承認依頼のメッセージにコメント入力欄を最初から表示する形に変えました。
「承認してからコメントを入れる」流れは、受け取る側には分かりにくいです。承認依頼が届いた時点でコメント欄が見えているほうが操作しやすい。最初にどちらの形にするかを決めておかないと、後で作り直しになります。
必要なもの
- Slack App(ワークスペースに登録したBotアカウント)
- サーバーレス関数を動かす場所(今回はNetlify Functions)
- Googleスプレッドシート(承認者リストと申請ログの管理)
- スプシにアクセスするためのサービスアカウント(Google Cloud側で発行)
特別に高価なものはありません。Netlifyの無料枠、Googleアカウントで作れるスプシ、Slackの無料プランでも動きます。
