n8n × LINE × Google Sheetsで「現場DXサーベイ」を無料で自作する|全コード公開ハンズオン

本記事では、月額0円で稼働する「LINE完結型のアンケートシステム」を、n8nとGoogle Sheetsを使って構築します。
- 「現場の職人さんにWebフォームのURLを送っても、誰も答えてくれない」
- 「SaaSを導入しようとしたが、月額費用が高すぎて稟議が通らない」
- 「自社の業務に合わせて、質問内容や通知タイミングを自由にカスタマイズしたい」
このような悩みを持つエンジニアやDX担当者のために、「LINEで毎日5問だけ答えるマイクロサーベイ」の実装手順を完全公開します。
本記事は、抽象的な戦略論ではなく、「実際に動くコード」と「設定ファイル(JSON)」を提供するハンズオン記事です。
n8n環境さえあれば、約1時間でプロトタイプを稼働させることができます。
n8n環境の構築は以下の2記事のどちらかを参考にされてください。どちらもコピペで終わるので15分程度で環境構築ができます。
今回は無料で使えることを目標としたので、上記で環境構築して作っております。
本ハンズオンのゴールとシステム構成
本記事で構築するのは、LINE公式アカウントをインターフェースとし、Google Sheetsをデータベースとして利用する、n8nベースのアンケートシステムです。
ユーザー(従業員)は、毎日決まった時間にLINEで通知を受け取り、タップ操作だけで回答を完了できます。
サーバーレス(Cloud Run等)またはVPS上のn8nで動作し、ランニングコストを極限まで抑えた構成です。
n8nの基本的な使い方や、Zapier・Makeとの詳細な機能比較、セルフホスト運用のメリットについては、以下の完全ガイドで網羅的に解説しています。
n8n完全ガイド|Zapierより安く自社サーバーで動かす最強の自動化ツール
🚀 資材ダウンロード
本記事で使用する全ワークフローをまとめたJSONファイルとスプレッドシートです。
まずはこれをダウンロードし、n8nにインポートしてから解説を読み進めてください。
【n8nのインポート方法】

- ダウンロードしたファイルをテキストエディタ(メモ帳など)で開く。
- 中身のテキストを「すべて選択(Ctrl+A)」して「コピー(Ctrl+C)」。
- n8nのキャンバス上で「貼り付け(Ctrl+V)」。
- 全ノードが一括で配置されます。
作るもの:毎日5問、LINEで答えるマイクロサーベイ

- インターフェース: 使い慣れたLINE。ログイン不要。
- 回答負荷: 1日5問限定。選択肢ボタンをタップするだけ。
- 継続性: 毎日自動で通知が届き、前日の続きから再開できる(ステート管理)。
システム構成図とデータの流れ
システムは非常にシンプルです。
- LINE: ユーザーとの接点(メッセージ送受信)。
- n8n: ロジックの中枢。メッセージの解析、分岐、生成を行う。
- Google Sheets: データベース。ユーザー情報、質問マスタ、回答ログを保存。
【重要】本システムは「プロトタイプ」です
本記事で紹介する構成は、Google Sheets APIをデータベースとして利用するため、「同時アクセス数」や「処理速度」に物理的な限界があります。
スプレッドシートへの読み込み・書き込みや、Cloud Runを常時稼働させているわけではないので、どうしてもラグが発生します。具体的にはメッセージが送られるまで10秒程度かかってしまいます。
PoC(概念実証)には最適ですが、本格運用には、以下の対応が必須です。
- データベースの移行(Supabase等)
- VPSへの移行
どちらも10秒から3秒近くまでの短縮効果がありました。

まずは「小さく始めて効果を実感する」ための第一歩としてご活用ください。
Step1:データベース設計(Google Sheets)
データベースとして使用するGoogle Sheetsには、「users(ユーザー管理)」「questions(質問マスタ)」「answers(回答ログ)」の3つのシートを作成します。
特にusersシートでは、現在の回答進捗(current_question)を管理し、ステートレスなLINE Botに文脈を持たせます。
3つのテーブル定義(users, questions, answers)
新規スプレッドシートを作成し、以下の3つのシートを用意してください。
1. users シート(ユーザー状態管理)
誰が「今」何問目まで進んでいるかを管理します。
カラム名 | 意味 | データ例 |
|---|---|---|
user_id | LINEのユーザーID (PK) | U1234abcd... |
display_name | 表示名 | 山田 太郎 |
current_question | 次に出題する質問ID | 6 |
daily_count | 本日の回答数 | 2 |
2. questions シート(質問マスタ)
質問文と選択肢を管理します。
カラム名 | 意味 | データ例 |
|---|---|---|
q_id | 質問ID (PK) | 1 |
question_text | 質問本文 | 昨晩はよく眠れましたか? |
options | 選択肢 (カンマ区切り) | はい,いいえ,普通 |
3. answers シート(回答ログ)
回答データを蓄積します。
カラム名 | 意味 | データ例 |
|---|---|---|
answer_id | 回答ID (自動連番) | 1001 |
user_id | 誰が | U1234abcd... |
q_id | どの質問に | 1 |
answer_text | 何と答えた | はい |
timestamp | いつ | 2025-01-01 09:00:00 |
ID自動採番の関数実装
n8n側でIDを採番すると競合するリスクがあるため、スプレッドシートの関数で自動採番します。
answers シートのA1セル(ヘッダー)に以下の関数を入力してください。
={"answer_id"; ARRAYFORMULA(IF(B2:B<>"", ROW(B2:B)-1, ""))}これにより、B列(user_id)にデータが入ると、自動的にA列に連番が振られます。
Step2:LINE DevelopersとGoogle Cloudの設定
n8nが外部サービスと連携するために、LINE Messaging APIのチャネル作成と、Google Cloud Platform(GCP)でのAPI有効化・OAuth認証情報の作成を行います。
LINE Messaging APIのチャネル作成と設定
プロバイダーとチャネル(Messaging API)の作成

LINE Developersにログインします。
LINEをお持ちの方はLINEアカウントでログインを選びましょう。

次にプロバイダーを作成します。

お好きな名前でOKです。
作成しましょう。

次に、Messaging APIをクリックします。

「LINE公式アカウントを作成する」をクリックしてください。

こちらの内容は各会社さんごとに入力をお願いいたします。

「設定」>「Messaging API>「Messaging APIを利用する」をクリックします。

先ほどのLINE Developersに戻ってください。
そうすると、先ほどの公式アカウントが紐づいています。

LINE公式アカウント機能設定で、「応答メッセージ」と「あいさつメッセージ」をオフにします。

チャネルアクセストークンの発行
「n8n_test」>「Messaging API設定」>「チャネルアクセストークン」に移動し、チャネルアクセストークンを発行します。

Webhookの設定
n8nの画面に行き、「LINE受信」をクリックしてください。

このProduction URLをコピーしてください。

コピーしたURLをWebhookに貼り付けます。(注意:必ずポート番号を抜くようにしてください)

最後にLINE公式アカウントのWebhookをオンにすれば完了です。

LINE公式アカウントでの設定は以上です。
お疲れ様でした。
GCPでのAPI有効化と認証情報取得
プロジェクトの作成
上部からプロジェクトを作成してください。(cloud runでn8n環境を作られた方はこちらはスキップでOKです)

APIを有効化

上部の検索窓から以下の2つを検索して有効化してください。
- Google Sheets API
- Google Drive API
OAuth同意画面の作成
検索窓で「OAuth」と検索してください。
以下のページに遷移できればOKです。

次に、プロジェクトを作成します。「開始」をクリックしてください。

次に、「クライアント」を作成しましょう。

リダイレクトURIには以下を入力してください。
https://あなたのドメイン/rest/oauth2-credential/callback作成が完了したら、クライアントIDとクライアントシークレットを控えておきます。
【重要】OAuth同意画面の公開設定

GCPでOAuth同意画面を作成した際、デフォルトの「Publishing status(公開ステータス)」は テスト中 になっています。
この状態では、認証トークンが7日で期限切れになり、n8nの連携が突然停止します。
- 対策A(推奨): 「PUBLISH APP(アプリを公開)」ボタンを押し、ステータスを In production に変更する。
- 対策B: テストモードのまま運用する場合、7日ごとにn8n上で再認証(Reconnect)を行う必要があります。
必ず対策Aを実施し、恒久的な接続を確保してください。
Step3:【実装編1】友だち追加時のユーザー登録フロー
まずは、Step2までで準備してきたものをn8nで使えるようにしていきましょう。
n8n内でLINE, Googleスプレッドシートを使えるようにする
LINE認証
以下の「プロフィール取得」をクリックしてください。

こちらのパッケージをインストールします。

インストールが完了したら次は認証を行います。

以下の2つをコピペしてください。
- チャネルアクセストークン
- チャネルシークレット
成功すればOKです。
スプレッドシート認証
LINEと同様にn8n内のスプレッドシートの箇所をクリックして、認証していきます。
先ほど控えておいた以下の2つをコピペしてください。
- クライアントID
- クライアントシークレット
そしてGoogleでサインインすると成功します。
ここからは、先ほどインポートしたJSONの中身を解説していきます。
まずは、ワークフローの上部分にある「友だち追加(Follow)」の処理を見ていきましょう。
ノード解説:プロフィール取得とDB検索
- LINEからのイベントを受け取ります。
- イベントタイプが follow(友だち追加)か message(回答)かを判定します。
- LINE APIを叩き、ユーザーの表示名を取得します。
- users シートを検索し、既に登録済みかどうかを確認します。
ロジックのポイント
Check User ノードの結果が「空(Empty)」なら新規ユーザー、「データあり」なら既存ユーザー(ブロック解除など)と判定します。
新規なら AppendノードでDBに登録し、既存なら登録処理をスキップして「おかえりなさい」メッセージを送ることで、データの重複を防いでいます。
Step4:【実装編2】回答処理と動的Flex Message生成
次に、ワークフローの中央にある、ユーザーからの回答を受け取って次の質問を送信するメイン処理です。
JavaScriptによるステート管理と終了判定
中央にある 「計算と判断」 というCodeノードが心臓部です。
ここでは、スプレッドシートから取得した「現在の進捗」を数値化し、次のステップを計算しています。
// 前のノードからデータを取得
const user = $("回答者受信").item.json;
const currentQ = parseInt(user.current_question || 0); // 現在の設問番号
const dailyCount = parseInt(user.daily_count || 0); // 今日の回答数
// 計算実行
const nextQ = currentQ + 1; // 次の問題番号
const nextCount = dailyCount + 1; // 回答数を+1
// 判定: 今日5問答えたか?(または全100問終わったか?)
// ★テスト用に「5」にしていますが、変えたい場合はここを変更
const limit = 5;
const isFinishedToday = nextCount >= limit;
const isAllComplete = nextQ > 100; // 全問完了
// 次のノードに渡すデータを作る
return {
json: {
user_id: user.user_id,
next_question_id: nextQ, // 更新用の設問番号
next_daily_count: nextCount, // 更新用の回答数
is_stop: isFinishedToday || isAllComplete, // 止めるかどうかのフラグ
message_type: isFinishedToday ? 'finish' : 'next' // 終了ならfinish, 次があるならnext
}
};Flex Messageの動的生成ロジック
その右側にある 「ボタン作成」 ノードでは、質問シートの options カラム(例: "はい,いいえ")を読み込み、LINEのFlex Message形式のJSONに変換しています。
【重要】Flex Message Simulatorでの検証
LINEのFlex MessageはJSON構造が厳密です。構文エラーがあると、エラーログも出ずにメッセージが届かない(既読スルー状態)になります。
実装時は、必ず Flex Message Simulator でJSONの構造が正しいか確認してください。
const item = $('問題取得').item.json;
const questionText = item.question_text || "質問";
const optionsString = item.options || "";
// 1. 選択肢をボタン配列に変換
const buttonContents = optionsString.split(',')
.map(opt => opt.trim())
.filter(opt => opt !== "")
.map(opt => ({
"type": "button",
"style": "link",
"height": "sm",
"action": {
"type": "message",
"label": opt, // ラベル
"text": opt // 実際に送信される文字
}
}));
// 2. Bubble Container(中身)だけを作る
const bubbleContainer = {
"type": "bubble",
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{
"type": "text",
"text": questionText,
"weight": "bold",
"size": "md",
"wrap": true
}
]
},
"footer": {
"type": "box",
"layout": "vertical",
"spacing": "sm",
"contents": buttonContents,
"flex": 0
}
};
// 3. 次のノードへ渡す
return {
json: {
question_text: questionText, // Alt Text用に別で渡す
flex_contents: bubbleContainer // 中身だけ渡す
}
};Step5:【実装編3】毎朝の定期配信スケジューラー
最後に、ワークフローの下部にある「定期実行(Schedule)」部分です。
毎日決まった時間にトリガーを実行し、全ユーザーに対して「今日のアンケート」の開始メッセージを送信します。
回答数リセットと送信対象のフィルタリング
このワークフローの重要な役割は、「本日の回答数(daily_count)」のリセットです。
朝の配信時に、全ユーザーの daily_count を 0 に更新(Update Row)します。
これを忘れると、翌日になっても「本日の上限に達しました」と判定され、アンケートが進まなくなります。
【処理の流れ】
- Schedule Trigger: 毎日9時に起動。
- Get All Users: 全ユーザーを取得。
- Reset Count: 全員の daily_count を0に更新。
- Filter: 全問回答済みのユーザーを除外。
- Send Message: 対象者に「今日のアンケートを始めます」と送信。
よくある質問(FAQ)
実装時によくあるトラブルや、運用に関する疑問をまとめました。
Q502 Bad Gatewayエラーが出ます
n8nが起動していないか、Webhookのタイムアウト(デフォルト30秒)を超えている可能性があります。
Google Sheets APIのレスポンスが遅い場合、LINE側でタイムアウト判定されることがあります。n8nのWebhookノード設定で Respond: Immediately(即時レスポンス)に設定し、処理はバックグラウンドで行うようにしてください。
Qボタンを押しても反応が遅いです
Google Sheets APIをデータベースとして使用しているため、10秒程度のラグが発生するのは仕様です。
これを解消するには、SupabaseやMySQLなどの本格的なデータベースや、VPSへの移行が必要です。
ラグを無くし、サクサク動く環境を作りたい場合は、Difyとn8nをXserver VPSで一括構築する方法への移行を検討してください。
Qユーザーが増えたらどうすればいいですか?
スプレッドシートは数千行を超えると急激に重くなります。
ユーザー数が数十人を超え、動作が重くなってきたら、データベースの移行を検討してください。n8nのロジックはそのままで、Google SheetsノードをPostgresノードに置き換えるだけで移行可能です。
まとめ
本記事では、n8nとLINE、Google Sheetsを使って、月額0円で稼働するアンケートシステムを構築しました。
- Step1: スプレッドシートでDBを設計する。
- Step2: LINEとGCPのAPI設定を行う(OAuthの公開設定を忘れずに)。
- Step3〜5: 配布されたJSONをインポートし、認証情報を設定する。
このシステムはプロトタイプですが、現場の課題を解決する「最初の一歩」としては十分な機能を持っています。
まずは実際に動かしてみて、現場の反応を見ながら改善を重ねていってください。
また、今回作成したLINE Botに「AI(Dify)」を組み込めば、質問に対して自動で賢く回答する「AI社員」に進化します。
Difyとn8nの連携パターンと「AI社員」の作り方も合わせてご覧ください。
無料相談のご案内
- 「JSONをインポートしたがエラーが出る」
- 「自社用にカスタマイズしたいが、JavaScriptがわからない」
- 「本格運用に向けて、データベースをSupabaseに移行したい」
conetsでは、n8nの実装サポートから、本格的なシステム構築への移行支援までを行う無料相談(オンライン/60分)を実施しています。
【無料相談で得られる価値】
- 実装トラブルの原因特定と解決策
- 貴社の業務フローに合わせたカスタマイズ提案
- スプレッドシート卒業(DB移行)のロードマップ提示
お気軽にご活用ください。
