Kuboyage

・ AI / 自動化

n8n × Apify × Google SheetsでTikTok自動分析ツールを作った話 — セットアップからテンプレート自動化まで

この記事について 📖

対象読者: SNSデータの自動収集・分析に興味があるマーケター・エンジニア / n8nやApifyの実践的な使い方を知りたい方

この記事で扱うこと:

  • n8n v2(Docker)+ Apify + Google Sheetsによるデータ収集パイプライン構築
  • Community Nodeのサイレント障害の発見と修正
  • Google Apps Scriptによるテンプレートスプレッドシート自動生成
  • テンプレートコピーを含む完全自動化ワークフローの構築

はじめに 👋

こんにちは!H×Hのセンリツ大好きエンジニアです!✌️

※この記事はAIと2人3脚で執筆されています

自分のTikTokアカウント(@lifture_app)の投稿パフォーマンスを分析して、バズる投稿の法則を見つけたい。そんな動機から、Apify + n8n + Google Sheetsを組み合わせたTikTok自動分析ツールを構築しました。

DataReportalによると、日本のTikTokユーザーは3,300万人と急成長中。このデータを手動で分析するのは非現実的であり、自動化パイプラインの構築は必然でした。

この記事では、設計から実運用で遭遇した障害の解決、テンプレート自動化まで、ハマったポイントも含めて正直に記録します。

この記事はおよそ8,000字なので、15分で読めます!

目次 📚

  1. 全体アーキテクチャ
  2. データ収集パイプラインの構築
  3. テンプレートスプレッドシートとワークフロー自動化
  4. ハマったポイントと障害対応
  5. 実運用で得た教訓

1. 全体アーキテクチャ 🏗️

「n8nでデータ収集、Google Sheetsに出力、Claude Codeで分析するシンプルな3層構成」

当初はn8n内でClaude APIを叩いて投稿案まで自動生成する設計でしたが、投稿のブラッシュアップは対話的にやりたいというニーズがあり、Claude Code(ローカル)との連携に切り替えました。

n8n(Docker): Apifyでデータ取得 → 整形 → Google Sheetsに書き込み Google Sheets: ダッシュボード付きテンプレートで自動分析 Claude Code: スプシのデータを読み込んで投稿案を作成

2. データ収集パイプラインの構築 📊

「n8n v2 + Apify Community Node + Google Sheetsで5ノードのパイプラインを構築」

n8n v2のDocker環境

n8n v2はセキュリティ強化リリースです。Docker Composeで起動します。

docker-compose.yml(最終版)
version: '3.8'

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n-sns-analyze
    restart: unless-stopped
    ports:
      - "5679:5678"
    environment:
      - WEBHOOK_URL=http://localhost:5679/
      - N8N_EDITOR_BASE_URL=http://localhost:5679/
      - GENERIC_TIMEZONE=Asia/Tokyo
      - TZ=Asia/Tokyo
      - N8N_BLOCK_ENV_ACCESS_IN_NODE=false
      - N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
      - APIFY_API_TOKEN=${APIFY_API_TOKEN}
    volumes:
      - ./n8n/data:/home/node/.n8n

ワークフロー構成(5ノード)

ワークフロー(5ノード構成) 初期のワークフロー。Manual Trigger → Apify → Get Dataset → Flatten → Google Sheets

Apify Community Nodeの設定

n8n UIからSettings > Community Nodesで@apify/n8n-nodes-apifyをインストールし、参考記事を参考に設定します。Actor Sourceを「Apify Store Actors」、ModeをBy IDに設定し、TikTok ScraperのInternal IDを使用します。

Apify Community Nodeはrun metadataのみを返すため、実際の投稿データはHTTP Requestノードで別途取得する必要があります。

GET https://api.apify.com/v2/datasets/{{ $json.defaultDatasetId }}/items
Authorization: Bearer {{$env.APIFY_API_TOKEN}}

Code nodeでデータ整形・ER計算

データ整形のCode node(20行)
const items = $input.all();
const now = new Date().toISOString();
return items.map(item => {
  const p = item.json;
  const plays = Number(p.playCount) || 0;
  const likes = Number(p.diggCount) || 0;
  const comments = Number(p.commentCount) || 0;
  const shares = Number(p.shareCount) || 0;
  const saves = Number(p.collectCount) || 0;
  const engagement = likes + comments + shares;
  const er = plays > 0
    ? Math.round(engagement / plays * 10000) / 100
    : 0;
  return {
    json: {
      '取得日': now.split('T')[0],
      '投稿日': (p.createTimeISO || '').split('T')[0],
      'テキスト': (p.text || '').substring(0, 150),
      '再生数': plays, 'いいね': likes,
      'コメント': comments, 'シェア': shares, '保存': saves,
      'エンゲージメント合計': engagement, 'ER(%)': er,
      '形式': p.isSlideshow ? 'スライドショー' : '動画',
      'ハッシュタグ': (p.hashtags || []).map(h => h.name || h).join(', '),
      'URL': p.webVideoUrl || ''
    }
  };
});

Google Sheets連携

Google Cloud ConsoleでGoogle Sheets APIを有効化し、OAuth同意画面を設定。リダイレクトURIは http://localhost:5679/rest/oauth2-credential/callback を指定します。

正常に動作すると、7件のTikTok投稿データがスプレッドシートに書き込まれます。

スプレッドシートに7件のデータが書き込まれた 7件のTikTok投稿データが全カラム揃ってスプレッドシートに書き込まれた

3. テンプレートスプレッドシートとワークフロー自動化 ⚙️

「テンプレートをコピーして使う方式で、レポートの一貫性と自動化を両立する」

テンプレート設計(3シート構成)

毎回テンプレートをコピーして使う方式を採用しました。Google Apps Scriptで以下のテンプレートを自動生成しています。

  • ダッシュボード: サマリー(投稿数・平均再生数・平均ER)、TOP3バズ投稿、エンゲージメント内訳
  • トレンド分析: 曜日別パフォーマンス、形式別比較(スライドショー vs 動画)
  • Raw Data: n8nが書き込む先(16カラム)

すべての値はRaw Dataシートの数式参照で自動計算されます。 データを入れるだけでダッシュボードが完成します。

Apps Script実行成功ログ Apps Scriptの実行ログ。テンプレートURL・フォルダURLが出力されている

テンプレートのダッシュボードシート 自動生成されたテンプレート。ダッシュボード・トレンド分析・Raw Dataの3タブ構成

ワークフロー拡張: 7ノード構成

テンプレートのコピーもn8nで自動化するため、ワークフローを7ノードに拡張しました。

                ┌→ Apify → Get Dataset → Flatten ─┐
Manual Trigger ─┤                                    ├→ Merge → Google Sheets
                └→ Copy Template ─────────────────────┘

Copy TemplateノードはGoogle Drive APIのFiles: copyを使用し、Mergeノードでコピー先のスプレッドシートIDをデータに付与します。Google Sheetsノードは ={{ $json._spreadsheetId }} で動的にIDを参照します。

拡張後の7ノードワークフロー 拡張後のワークフロー。Manual Triggerから上段(Apify)と下段(Copy Template)に分岐

これにより、ワークフロー実行のたびに新しいスプレッドシートが自動作成され、ダッシュボード付きのレポートが完成します。

4. ハマったポイントと障害対応 🐛

「n8n v2 + Community Nodeの組み合わせで遭遇した落とし穴をすべて公開」

n8n v2のハマりポイント3つ

1. 環境変数アクセスがデフォルトでブロック

n8n v2では$envへのアクセスがデフォルトでブロックされています。ネット上の古い記事にある N8N_RESTRICT_ENVIRONMENT_VARIABLES_ACCESS は存在しない設定名です。

# ✅ 正しい設定名
N8N_BLOCK_ENV_ACCESS_IN_NODE=false

2. Code nodeでrequire('fs')が使えない

v2ではTask Runnerがデフォルト有効で、Code nodeがサンドボックスで実行されます。require('fs')はセキュリティ脆弱性(GHSA-j4p8-h8mh-rh8q)の修正でブロック。代替はConvert to File + Read/Write Files from Diskノードです。

3. Docker環境でのOAuth callbackポート不一致

Dockerのポートマッピングが5679:5678の場合、N8N_EDITOR_BASE_URLを設定しないとGoogle OAuthのcallback URLが内部ポート5678で生成されて失敗します。

サイレント障害: ワークフロー"成功"なのにデータが空

これが最も厄介な問題でした。ワークフロー実行は毎回「成功」表示。しかしスプシには1行のみ、全値0のデータしか入りません。

ワークフロー実行成功(7 items) 修正後の実行結果。修正前は全ノード緑チェックなのにデータが空だった

SQLiteデータベースから実行データを直接解析したところ、**Apifyのrunステータスが毎回FAILED**であることを発見。@apify/n8n-nodes-apifyのアップデートにより、パラメータ名がサイレントに変更されていました。

項目旧バージョン新バージョン
入力パラメータ名runInputcustomBody
resource(不要)Actors
operation(不要)Run actor
// run-actor/execute.js — 'customBody'が見つからずデフォルト値'{}'が使われる
const rawStringifiedInput = this.getNodeParameter('customBody', i, '{}');

SQLiteデータベースを直接編集してパラメータ名を修正し、解決しました。Community Nodeにはn8n本体のようなマイグレーション機構がないため、アップデートがワークフローをサイレントに壊す可能性があります。

n8n v2 Breaking Changesまとめ

変更点v1v2
Task RunnerOFFON(デフォルト)
$env アクセス許可ブロック
require('fs')可能不可
MySQL/MariaDBサポート廃止

詳細は公式ドキュメントを参照してください。

5. 実運用で得た教訓 📚

「2日間の開発で得られた、実践的な知見をまとめます」

Community Nodeは信用しすぎない

バージョン固定と中間ノード出力の確認を推奨します。「ワークフロー成功」≠「データが正しい」という認識が重要です。

n8nのSQLiteは強力なデバッグツール

execution_dataテーブルに各ノードの入出力が完全に記録されています。UIでは見えない中間データの解析に有効です。ただしホストからのSQLite編集はn8nコンテナ停止中に行うこと。WALモードでの同時アクセスはDB破損の原因になります。

Apifyの従量課金を意識する

Apify TikTok ScraperはPay-per-event型($0.03/Actor起動 + $0.004/件)。テスト実行で無駄にクレジットを消費しないよう、修正が確実な場合のみ実行が鉄則です。

テンプレート方式のメリット

  • レポートの一貫性: すべてのレポートが同じ構造
  • ダッシュボード自動計算: データを入れるだけで分析結果が見られる
  • 履歴管理: 過去のレポートがそのまま残る

まとめ 🎊

  • Apify + n8n + Google SheetsでTikTokデータの自動収集パイプラインを構築
  • n8n v2はセキュリティ強化が大きく、v1の記事そのままでは動かない
  • Community Nodeのサイレントなパラメータ名変更がワークフローを壊す — SQLiteでデバッグ可能
  • Google Apps Scriptでダッシュボード付きテンプレートを自動生成
  • テンプレートコピー自動化で7ノード構成の完全自動ワークフローを実現

今後の展望

  • X(Twitter)/ Instagram への対応拡大
  • Schedule Triggerでの定期自動実行
  • Claude Code連携でのバズ投稿分析・投稿案作成フロー確立

参考リンク 🔗

公式ドキュメント

参考記事・データ

ブログの記事一覧へ