・ AI / 自動化

この記事について 📖
対象読者: 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. 全体アーキテクチャ 🏗️
「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ノード)
初期のワークフロー。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件のTikTok投稿データが全カラム揃ってスプレッドシートに書き込まれた
3. テンプレートスプレッドシートとワークフロー自動化 ⚙️
「テンプレートをコピーして使う方式で、レポートの一貫性と自動化を両立する」
テンプレート設計(3シート構成)
毎回テンプレートをコピーして使う方式を採用しました。Google Apps Scriptで以下のテンプレートを自動生成しています。
- ダッシュボード: サマリー(投稿数・平均再生数・平均ER)、TOP3バズ投稿、エンゲージメント内訳
- トレンド分析: 曜日別パフォーマンス、形式別比較(スライドショー vs 動画)
- Raw Data: n8nが書き込む先(16カラム)
すべての値はRaw Dataシートの数式参照で自動計算されます。 データを入れるだけでダッシュボードが完成します。
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を参照します。
拡張後のワークフロー。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のデータしか入りません。
修正後の実行結果。修正前は全ノード緑チェックなのにデータが空だった
SQLiteデータベースから実行データを直接解析したところ、**Apifyのrunステータスが毎回FAILED**であることを発見。@apify/n8n-nodes-apifyのアップデートにより、パラメータ名がサイレントに変更されていました。
| 項目 | 旧バージョン | 新バージョン |
|---|---|---|
| 入力パラメータ名 | runInput | customBody |
| resource | (不要) | Actors |
| operation | (不要) | Run actor |
// run-actor/execute.js — 'customBody'が見つからずデフォルト値'{}'が使われる
const rawStringifiedInput = this.getNodeParameter('customBody', i, '{}');
SQLiteデータベースを直接編集してパラメータ名を修正し、解決しました。Community Nodeにはn8n本体のようなマイグレーション機構がないため、アップデートがワークフローをサイレントに壊す可能性があります。
n8n v2 Breaking Changesまとめ
| 変更点 | v1 | v2 |
|---|---|---|
| Task Runner | OFF | ON(デフォルト) |
| $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連携でのバズ投稿分析・投稿案作成フロー確立
参考リンク 🔗
公式ドキュメント
- n8n v2.0 Breaking Changes
- n8n Release Notes
- Introducing n8n 2.0(n8n Blog)
- Apify TikTok Scraper
- Apify n8n Integration
- Google Drive API: Files.copy