n8n + Slack + Google Sheets:社内問い合わせ自動分類BOTの構築
Slackで届く問い合わせを、毎回手動でスプレッドシートに転記している——そのフローを、n8nで完全に自動化できる。
n8n(エヌエイトエヌ)はセルフホスト可能なワークフロー自動化ツールで、ノーコードUIとカスタムコード拡張の両方に対応する。
Slackのメッセージをn8nが受け取り、キーワードかAIで分類し、Google Sheetsへ自動記録するまでの設定を、この記事で一通り書く。この記事では、Slack Appの作成から、Google OAuth認証の落とし穴、Rate Limitへの対処まで実装手順を体系的にまとめる。
途中で詰まりやすい箇所は「落とし穴まとめ」にまとめてある。手順に入る前に確認しておくと、同じ箇所で止まらずに済む。
ワークフローの全体像
処理の流れは次のとおりだ。
Slack Trigger
↓
IFノード(bot_message除外)
↓
分類処理(Switchノード or OpenAI)
↓
Google Sheets Append Row
↓
任意:Slackへ受付返信
必要なサービスは以下の3つ。
| サービス | 用途 | 費用 |
|---|---|---|
| n8n | ワークフロー自動化エンジン | Cloud $24/月〜 / セルフホスト無料 |
| Slack | トリガー元・通知先 | 既存のワークスペースを使用 |
| Google Sheets | 問い合わせの記録・管理 | 無料(Googleアカウント) |
n8nのプランについて:n8nにはCloud版とセルフホスト版がある。Cloud版(Starter)は月$24で2,500実行まで、Pro(月$60)は10,000実行まで対応する(2026年6月時点・InstaPods調べ)。セルフホストのCommunity Editionは無料で実行回数の制限がない。本記事の手順はどちらでも共通だが、Watch Whole Workspace設定を使う場合は実行回数の消費が速くなるため後述の注意点を確認してほしい。
Slack Botの設定——App作成からn8nへの接続まで
Slack Appを作成する
api.slack.com/apps を開き、右上の「Create New App」をクリックする。作成方法は「From scratch」を選択する。App名とワークスペースを設定して「Create App」で完了だ。
Bot Token Scopesを設定する
左メニューの「OAuth & Permissions」→「Scopes」→「Bot Token Scopes」から必要なスコープを追加する。問い合わせBOTに必要な主なスコープは次のとおりだ。
channels:history:パブリックチャンネルのメッセージを読むchannels:read:チャンネル一覧を取得するchat:write:メッセージを送信するgroups:history:プライベートチャンネルのメッセージを読む(プライベートチャンネルを使う場合)im:history:DMのメッセージを読む(DM対応する場合)
スコープを設定したら、同ページ上部の「Install App to Workspace」でインストールする。インストール後に表示される「Bot User OAuth Token(xoxb-から始まる文字列)」をコピーして控えておく。
Event Subscriptionsを設定する
左メニューの「Event Subscriptions」を開き、「Enable Events」をONにする。
Request URLの欄にn8nのWebhook URLを貼り付ける。このURLはn8nでSlack Triggerノードを作成すると発行される。URLを貼り付けるとSlack側が検証リクエストを送り、n8nが応答すると「Verified」と表示される。
「Subscribe to bot events」セクションで message.channels を追加する。プライベートチャンネルも対象にする場合は message.groups も追加する。
注意:Socket ModeはOFFのまま使用する。Socket ModeをONにすると、n8nのWebhook URLではなくWebSocket接続が必要になり、標準のSlack TriggerノードとHTTP Method(URL)が競合する。
2クレデンシャル構成について
n8nでSlackを使う場合、クレデンシャルを2種類用意する構成が推奨されている(Ryan and Matt Data Science)。
- Slack Trigger用:「Slack API」クレデンシャル(APIトークン方式・xoxb-トークンを使用)
- Slack操作用:「Slack OAuth2」クレデンシャル(メッセージ送信など操作系ノードに使用)
APIトークン方式はすべてのノードで動作するが、公式推奨に従ってTriggerとOperationで使い分けるとトラブルシューティングが容易になる。
Botをチャンネルに招待する(よく忘れる)
Slack App設定が完了しても、Botを対象チャンネルに招待しないとメッセージを受信できない。Slackの対象チャンネルを開き、@ボット名 と入力して招待を完了させる。
この招待を忘れた状態でテストを実行しても、n8n側には何も届かない。「設定は合っているはずなのに動かない」という問題の大半はこの招待漏れによるものだ。
ボットメッセージの無限ループを防ぐ
Slack TriggerでBotが受信したメッセージを処理して返信すると、返信メッセージもTriggerに拾われてしまい、無限ループが発生する。放置するとSlackのRate Limitに引っかかり、BOT全体が一時的に停止する。
n8nのIF(条件分岐)ノードで、最初の分岐点に以下の条件を追加する。
{{$json.event.subtype}} が "bot_message" と等しい場合 → 処理を終了(False分岐へ)
n8nの場合、IFノードの条件設定で:
- Left Value:
{{$json.event.subtype}} - Operation:
is equal to - Right Value:
bot_message
この条件がTrueの場合(=BOTのメッセージ)はワークフローを止め、Falseの場合(=人間のメッセージ)のみ後続の分類処理に進む構成にする。
分類方式の選択——キーワードマッチングかAI分類か
問い合わせをカテゴリ分けする方法は2種類ある。コスト・精度・保守性の3軸で整理する。
方式A——キーワードマッチング(Switchノードのみ)
n8nのSwitchノードで、メッセージ本文に特定の文字列が含まれるかどうかで分岐させる方法だ。
設定例:
条件1: {{$json.event.text}} に "パスワード" が含まれる → カテゴリ「アカウント系」
条件2: {{$json.event.text}} に "請求" OR "支払い" が含まれる → カテゴリ「経理系」
条件3: {{$json.event.text}} に "機器" OR "PC" が含まれる → カテゴリ「ハード系」
Default: → カテゴリ「その他」
メリット:外部APIへの通信がない。追加費用ゼロ。動作が安定していてデバッグしやすい。
デメリット:「機器が届いていない」「振込が完了した」など、意図が文脈依存するメッセージは誤分類する。キーワードの追加・変更は手動メンテナンスが必要。
向いているケース:カテゴリが5種類以下で、問い合わせ表現が比較的固定されている組織。まず動くものを早く作りたいときの第一選択として有効だ。
方式B——AI分類(OpenAI API + Basic LLM Chainノード)
n8nのBasic LLM ChainノードにOpenAI APIを接続し、メッセージ本文を渡してカテゴリを返させる方法だ。
プロンプト例(n8nresources.devの構成を参考に日本語化):
以下の社内問い合わせメッセージを、次のカテゴリのいずれか一つに分類してください。
カテゴリ: 「アカウント系」「ハード系」「経理系」「ネットワーク系」「その他」
メッセージ: {{$json.event.text}}
カテゴリ名のみを返答してください。
n8nのBasic LLM ChainノードはOpenAIノードとセットで動作する。n8n公式ブログのSlack + AIワークフロー事例(blog.n8n.io)でも同様の構成が採用されている。
メリット:表現の揺れ・言い回しの多様性に強い。カテゴリを増やしてもプロンプト変更だけで対応できる。
デメリット:OpenAI APIの利用費用が発生する。費用はモデルと処理量によって変動するため、事前に料金表(platform.openai.com/docs/pricing)で確認のうえ見積もることを推奨する。1問い合わせあたりの費用は軽微だが、月間件数が多い場合は事前にコスト試算しておく。レスポンスタイムも方式Aより長くなる。
向いているケース:問い合わせ表現が多様で、カテゴリが6種類以上ある組織。問い合わせ内容が時期によって変化しやすい環境。
どちらを選ぶか
迷う場合は方式A(キーワードマッチング)から始めることを勧める。まず動くものを本番に乗せ、誤分類が目立ち始めたら方式Bへ移行する、という順序が現実的だ。
カテゴリ3〜5種・表現が比較的安定 → 方式A
カテゴリ6種以上・表現が多様・変化頻繁 → 方式B
Google Sheetsに自動記録する
記録するカラムを設計する
Sheetsのカラム設計を最初に確定させる。後からカラム名を変更すると、n8nのAppend Rowノードのマッピングが壊れるためだ(n8n公式ドキュメント・Google Sheets Common Issues)。
カラム設計の例:
| カラム名 | 内容 | n8nの参照値 |
|---|---|---|
| timestamp | 受信日時 | {{$now}} |
| channel | 受信チャンネルID | {{$json.event.channel}} |
| user | 送信者ユーザーID | {{$json.event.user}} |
| message | メッセージ本文 | {{$json.event.text}} |
| category | 分類結果 | Switchノード or AIノードの出力 |
| status | 対応ステータス | 手動入力用(初期値「未対応」等) |
カラム名を確定したら、1行目に見出しを入力してシートを保存する。
Google認証はService Accountを使う
n8nでGoogle Sheetsに接続する際、OAuth2認証を使うと7日でトークンが失効してBOTが停止するという問題が発生する(Ignite Ops)。
OAuth2は「ユーザーが操作するアプリ」向けに設計された認証方式であり、n8nのような自動化バックエンドには構造的に合っていない。Ignite Opsはこれを「OAuthは自動化バックエンドには適していない。Service Accountが正しい選択」と明示している。
Service Account認証の設定手順:
- Google Cloud Console(console.cloud.google.com)でプロジェクトを開き、「IAMと管理」→「サービスアカウント」→「サービスアカウントを作成」
- サービスアカウントの詳細画面から「キー」→「鍵を追加」→「JSON」でキーファイルをダウンロードする
- n8nの「Credentials」→「Add credential」→「Google Sheets API」を選択し、「Service Account」方式でJSONキーの内容を貼り付ける
- 使用するGoogle SheetsをGoogleドライブで開き、「共有」→ダウンロードしたJSONに記載のサービスアカウントメールアドレス(
〜@〜.iam.gserviceaccount.com)を編集者として追加する
この共有設定を忘れると、n8nからSheetsへの書き込みで権限エラーが返る。
なお、Google Sheets APIはGoogle Drive APIも同時に有効にする必要がある(n8n公式ドキュメント・Google OAuth2 generic)。Google Cloud ConsoleでSheets APIを有効化する際、Drive APIも合わせて有効化しておく。
Append Rowノードの設定
n8nのGoogle Sheetsノードで「Append Row」アクションを選択し、スプレッドシートIDとシート名を指定する。Mapping Modeは「Map Each Column Manually」を選択すると、カラム名と対応する値を明示的に設定できる。
先に述べたとおり、Sheetsのカラム名を後から変更するとマッピングが壊れる(n8n公式)。変更が必要になった場合は、n8n側のノード設定も必ず更新する。
Rate Limitと本番運用で起きる問題
SlackのRate Limit
Slack APIにはRate Limitがある。n8n公式ドキュメントによると、HTTPステータス429(Too Many Requests)が返った場合、「The service is receiving too many requests from you」というエラーになる。
対処としてはn8nのノード設定で「Retry On Fail」をONにし、Wait Between Trialsを1000ms以上に設定する。
Google Sheets APIの上限
Google Sheets APIには公式ドキュメント記載の上限がある(Google Sheets API公式: developers.google.com/sheets/api/limits 参照・最新の上限値は必ず公式で確認のこと)。問い合わせ量が多い場合は、Append RowごとにSleepノードで待機を挟む構成を検討する。
Watch Whole Workspaceの注意
Slack TriggerノードのWatch Whole Workspace設定を有効にすると、Botが参加しているすべてのチャンネルの全メッセージがトリガーになる。n8n公式ドキュメントには「Use with caution! This will use one execution for every event in any channel your bot or app is in.」と明記されている。
n8n Cloud Starterプランは2,500実行/月の上限があるため、大規模なワークスペースでThis設定をONにすると数日で上限に達することがある。対象チャンネルを絞る設定か、Proプランへの変更を検討する。
トークンのローテーション
Slack APIトークン(xoxb-)は有効期限がなく、明示的に再生成しない限り継続して使える。運用中にローテーションは不要だが、担当者が変わる際はトークンの管理移管を忘れずに行う。
落とし穴まとめ——詰まりやすい7箇所
| 落とし穴 | 何が起きるか | 対処法 |
|---|---|---|
| Botをチャンネルに招待していない | n8nにメッセージが届かない(エラーも出ない) | 対象チャンネルで @ボット名 と入力して招待する |
| Socket ModeをONにしている | Webhook URLが機能せずTriggerが動かない | Event SubscriptionsのSocket ModeをOFFにする |
| bot_messageの除外がない | 返信がループしてRate Limitに引っかかる | IFノードで subtype === bot_message を除外する |
| Google OAuth2認証を使っている | 7日でトークンが失効してBOTが停止する | Service Account認証に切り替える |
| SheetsをService Accountと共有していない | 書き込みで権限エラーになる | サービスアカウントメールをSheetsの共有に追加する |
| Google Sheets APIのみ有効化している | Google Drive API required エラーが出る | Cloud ConsoleでDrive APIも有効化する |
| Sheetsのカラム名を後から変更した | Append Rowのマッピングが壊れてデータが入らない | カラム名変更後にn8n側のノード設定を必ず更新する |
コストと工数削減の目安
コスト概算(2026年6月時点)
| 項目 | 費用 |
|---|---|
| n8n Cloud Starter | $24/月(2,500実行) |
| n8n Cloud Pro | $60/月(10,000実行) |
| n8n セルフホスト | 無料(VPS費用のみ) |
| Google Sheets | 無料 |
| OpenAI API(方式Bの場合) | 利用量に応じて変動・事前に料金表で確認推奨 |
n8nの価格データはInstaPods(2026年6月確認)による。セルフホストの場合はVPS費用(月数百円〜)が別途発生する。
工数削減の参考値
社内問い合わせの自動化による工数削減については、以下の参考値がある。ただしこれらはチャットボット製品(専用SaaS)の事例であり、n8nによるカスタム構築で同じ効果が保証されるわけではない。実際の削減量は問い合わせ量・カテゴリ精度・運用フローによって異なる。
- RICOHチャットボットサービスの事例:導入後3ヶ月でヘルプデスク業務を約30%効率化(RICOH Chatbot Service公式)
- Tayori Blogの試算例:月100件の問い合わせのうち30%(30件)を自己解決に誘導した場合、月間450分(約7.5時間)の削減(1件15分の対応時間を想定)
n8nによる自動分類は「手入力作業の削減」「担当者への転記漏れ防止」という効果が主になる。工数削減の見積もりは、現状の1件あたり転記時間×月間件数をベースに自組織で算出することを推奨する。
構築が難しいと感じたら
設定の途中で判断に迷うポイントが多いのは、このBOTに限った話ではない。n8nはノードの組み合わせが自由な分、「どう組めば本番で壊れないか」の判断が構築経験に依存する。
まず方針だけを決める壁打ち相談でも構わない。
相談時に以下を書き添えてもらえると、初回のやりとりが少なくて済む。
- 組織の規模(Slackのメンバー数・問い合わせ件数の目安)
- 現在のSlack利用状況(チャンネル構成・Bot導入の有無)
- n8nの形態(Cloud版を使うか、セルフホストを検討しているか)