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

AI自動化
公開2025年12月13日
更新2025年12月14日
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のインポート方法】

n8nのインポート方法
  1. ダウンロードしたファイルをテキストエディタ(メモ帳など)で開く。
  2. 中身のテキストを「すべて選択(Ctrl+A)」して「コピー(Ctrl+C)」。
  3. n8nのキャンバス上で「貼り付け(Ctrl+V)」。
  4. 全ノードが一括で配置されます。

作るもの:毎日5問、LINEで答えるマイクロサーベイ

作るもの:毎日5問、LINEで答えるマイクロサーベイ
  • インターフェース: 使い慣れたLINE。ログイン不要。
  • 回答負荷: 1日5問限定。選択肢ボタンをタップするだけ。
  • 継続性: 毎日自動で通知が届き、前日の続きから再開できる(ステート管理)。

システム構成図とデータの流れ

システムは非常にシンプルです。

  1. LINE: ユーザーとの接点(メッセージ送受信)。
  2. n8n: ロジックの中枢。メッセージの解析、分岐、生成を行う。
  3. 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検索

  1. LINEからのイベントを受け取ります。
  2. イベントタイプが follow(友だち追加)か message(回答)かを判定します。
  3. LINE APIを叩き、ユーザーの表示名を取得します。
  4. 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)します。

これを忘れると、翌日になっても「本日の上限に達しました」と判定され、アンケートが進まなくなります。

【処理の流れ】

  1. Schedule Trigger: 毎日9時に起動。
  2. Get All Users: 全ユーザーを取得。
  3. Reset Count: 全員の daily_count を0に更新。
  4. Filter: 全問回答済みのユーザーを除外。
  5. Send Message: 対象者に「今日のアンケートを始めます」と送信。

よくある質問(FAQ)

実装時によくあるトラブルや、運用に関する疑問をまとめました。

Q502 Bad Gatewayエラーが出ます
A

n8nが起動していないか、Webhookのタイムアウト(デフォルト30秒)を超えている可能性があります。
Google Sheets APIのレスポンスが遅い場合、LINE側でタイムアウト判定されることがあります。n8nのWebhookノード設定で Respond: Immediately(即時レスポンス)に設定し、処理はバックグラウンドで行うようにしてください。

Qボタンを押しても反応が遅いです
A

Google Sheets APIをデータベースとして使用しているため、10秒程度のラグが発生するのは仕様です。
これを解消するには、SupabaseやMySQLなどの本格的なデータベースや、VPSへの移行が必要です。
ラグを無くし、サクサク動く環境を作りたい場合は、Difyとn8nをXserver VPSで一括構築する方法への移行を検討してください。

Qユーザーが増えたらどうすればいいですか?
A

スプレッドシートは数千行を超えると急激に重くなります。
ユーザー数が数十人を超え、動作が重くなってきたら、データベースの移行を検討してください。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移行)のロードマップ提示

お気軽にご活用ください。

無料相談を申し込む>>

pick upピックアップ記事一覧

More Informationconetsについてさらに詳しく知る

CONTACT

無料相談のご予約

経営・集客・データ活用のお悩みを、
専門コンサルタントが丁寧にヒアリングし、
「今すぐ取り組むべき一手」を明確にします。
まずはお気軽にご相談ください。

  • 打ち手が散らかっている
  • 集客が安定しない
  • 広告が結果につながらない
  • CRMやデータ管理が複雑
  • 仕組み化が進まない

ご相談は24時間、
オンラインで受け付けています。

LINE相談・オンライン予約・フォームから
お問い合わせください。