はじめに
「ブログ記事を公開したら、Xでも告知しなきゃ」「毎日決まった時間に投稿したいけど、つい忘れてしまう」——SNS運用でこんな悩みを抱えていませんか?
本記事では、n8nとGoogle Sheetsを連携させて、X(Twitter)への投稿を完全に自動化するワークフローの構築方法を解説します。スプレッドシートに投稿内容とスケジュールを登録するだけで、平日の決まった時間にXへ自動で投稿され、投稿済みステータスまで自動更新される——そんな仕組みをn8nで実現できます。

完成イメージ
完成すると、以下のような流れで自動投稿が行われます。
[Google Sheets] 投稿内容・スケジュールを登録
↓
[n8n] 平日9:30に自動起動
↓
[n8n] スプレッドシートを読み込み、投稿対象を抽出
↓
[X (Twitter)] 投稿テキストを自動送信
↓
[Google Sheets] ステータスを「posted」に自動更新スプレッドシートに投稿テキストと配信日時を登録しておけば、あとはn8nが毎朝自動でチェックし、条件に合った投稿をXに送信します。投稿が完了するとスプレッドシートのステータスが自動で更新されるため、「いつ何を投稿したか」も一目で確認できます。
こんなシーンでの活用に適しています
- ブログ記事の公開告知をXで定期的に投稿したい
- SNS運用を担当しているが、毎日手動で投稿する時間を削減したい
- 複数の投稿をまとめて準備し、スケジュール通りに自動配信したい
方法: n8n × Google Sheets × X API
| 項目 | 内容 |
|---|---|
| メリット | 投稿の一元管理: スプレッドシートで投稿内容・スケジュール・ステータスを集約管理 手動作業ゼロ: 登録するだけで投稿完了 投稿忘れ防止: スケジュール通りに確実に投稿 履歴管理: 投稿日時やXのポストIDを自動記録 |
| デメリット | X APIが有料: 2026年3月現在、X APIはクレジット制(従量課金)で無料枠なし Developer Portal設定が必要: アプリ作成とOAuthキー取得の初期設定が必要 |
| 難易度 | ★★☆☆☆(初中級) 所要時間: 約45分 |
| 特徴 | Google Sheetsで投稿を管理 平日9:30にスケジュール実行(曜日・時刻カスタマイズ可) 1件ずつ安全に投稿(重複投稿防止) 投稿後にステータス自動更新 |
| 価格 | n8n: セルフホスト無料 / クラウド版 €20〜 X API: クレジット制(約$0.01/投稿) Google Sheets: 無料 |
事前準備
以下のアカウント・環境を用意してください。
- n8nアカウント(クラウド版 または セルフホスト版)
- X(Twitter)アカウント(投稿に使用するアカウント)
- X Developer Portalアカウント(APIキー取得用)
- Googleアカウント(Google Sheets用)
ポイント: X Developer Portalでは支払い方法(クレジットカード等)の登録が必要です。登録しないと投稿時に 402 Payment Required エラーが発生します。
設定手順
Step 1: X Developer Portalでアカウント登録
まず、X APIを利用するためにDeveloper Portalでアカウントを登録します。
1-1. X Developer Portal(developer.x.com)にアクセスし、投稿に使用するXアカウントでログインします。

1-2. 「Developer Account」に登録します。Free Accountで問題ありません。 用途の説明を求められた場合は、API経由での投稿に使用する旨を記入します。
1-3. 支払い方法を登録します。2026年3月現在、X APIは完全クレジット制(Pay Per Use)に移行しており、無料での投稿はできません。Developer Portalで支払い方法(クレジットカード等)を必ず登録してください。

1-4. クレジットを購入します。最初は$5からで問題ありません。

| 項目 | 内容 |
|---|---|
| 料金体系 | クレジット制(従量課金) |
| 投稿あたりの費用 | 約$0.01(1投稿あたり約1〜2円程度) |
| 無料枠 | なし(2026年3月時点) |
| 支払い方法未登録時 | 402 Payment Required エラー |
Step 2: アプリの作成と権限設定
Developer Portalでアプリを作成し、Xに投稿するための権限を設定します。
2-1. Developer Portalのダッシュボードで「アプリ」タブを確認します。自動作成されたアプリがあればそれを使用できます。なければ「+ Add App」で新規作成します(名前は任意)。

2-2. アプリの詳細画面を開き、画面下部の「設定を編集する」をクリックします。

2-3. 以下の項目を設定します。
| 設定項目 | 設定値 |
|---|---|
| アプリの権限 | 読み取りと書き込み |
| アプリの種類 | ウェブアプリ、事項化アプリまたはボット |
| コールバックURL/リダイレクトURL | n8nの X ノードのクレデンシャル設定画面に表示されるOAuth Redirect URLをコピーして貼り付け |
| Website URL | https://example.com(形式が正しければ任意のURLで可) |
注意: Callback URLには、n8nの Twitter ノードで「Create New Credential」を選択した際に表示されるOAuth Redirect URLを設定してください。localhost は「Not a valid URL format」エラーになるため使用できません。Website URLは形式さえ合っていれば任意のURLで問題ありません。

2-4. 「変更を保存する」をクリックして設定を保存します。
Step 3: APIキーの取得
n8nからXに投稿するために必要な4つのキーを取得します。
3-1. アプリの詳細画面で「OAuth 2.0 キー」のセクションを開き、「クライアントシークレット」の「再生成」をクリックします。

3-2. 表示されるクライアントシークレットをコピーしてクライアントIDと共に安全な場所に保存します。
重要: 必ずStep 2で権限を「Read and write」に変更した後にトークンを生成してください。変更前に生成したトークンは「読み取り」権限のみで投稿できません。アクセストークン欄に「読み取りと書き込み」と表示されていることを確認しましょう。取得したクライアントシークレットとクライアントIDはn8nの認証設定で使用します。
Step 4: Google Sheetsで投稿管理シートを作成
Xへの投稿内容やスケジュールを管理するスプレッドシートを作成します。
4-1. Google Sheetsで新しいスプレッドシートを作成します。
4-2. 1行目にヘッダーとして、以下のカラムを設定します。
| カラム名 | 説明 | 入力例 |
|---|---|---|
| id | 投稿の連番ID | 1 |
| status | 投稿ステータス | ready |
| title | 管理用タイトル | n8n入門記事の告知 |
| url | 紹介するURL | https://example.com/blog/n8n-intro |
| summary | 記事の概要メモ | n8nの基本を解説した記事 |
| x_post | Xに投稿するテキスト | n8nの入門記事を公開しました。... https://example.com/blog/n8n-intro |
| enabled | 有効/無効 | TRUE |
| scheduled_at | 投稿予定日時 | 2026-03-14T12:00:00+09:00 |
| posted_at | 投稿日時(自動記入) | (空欄のまま) |
| x_post_id | XのポストID(自動記入) | (空欄のまま) |
| last_error | エラー内容 | (空欄のまま) |
| retry_count | リトライ回数 | 0 |
| updated_at | 最終更新日時(自動記入) | (空欄のまま) |
4-3. 2行目以降に投稿データを入力します。status を ready、enabled を TRUE に設定し、scheduled_at に投稿したい日時を入力します。
ポイント: scheduled_at はISO 8601形式(例: 2026-03-14T12:00:00+09:00)で入力してください。投稿を一時停止したい場合は enabled を FALSE に変更するだけでOKです。
ステータスの使い分け
| ステータス | 意味 | 使い方 |
|---|---|---|
ready | 投稿準備完了 | ワークフローの投稿対象になる |
posted | 投稿済み | ワークフローが自動設定(手動変更不要) |
draft | 下書き | 投稿対象外。内容を検討中のときに使用 |
Step 5: n8nワークフローのインポートと認証設定
n8nにワークフローをインポートし、Google SheetsとX(Twitter)の認証情報を設定します。
5-1. 以下のコードをコピーし、JSONファイル形式(.json)で保存します。
{
"name": "自動化7_X自動投稿ワークフロー",
"nodes": [
{
"parameters": {
"documentId": {
"__rl": true,
"value": "1y4b4lTsrPmAYqUmSdXjqgVdX27sLYDz3eh0TiMYNhx0",
"mode": "list",
"cachedResultName": "X_posts_n8n_articles",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1y4b4lTsrPmAYqUmSdXjqgVdX27sLYDz3eh0TiMYNhx0/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 58828590,
"mode": "list",
"cachedResultName": "002_reizi_n8n_articles_posts",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1y4b4lTsrPmAYqUmSdXjqgVdX27sLYDz3eh0TiMYNhx0/edit#gid=58828590"
},
"options": {}
},
"id": "b0a1c002-read-4a00-b000-000000000002",
"name": "スプレッドシート読み込み",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
224,
208
],
"credentials": {
"googleSheetsOAuth2Api": {
"id": "fo3lC5VtAEDoLFxZ",
"name": "Google Sheets account"
}
}
},
{
"parameters": {
"jsCode": "const now = new Date();\nconst items = $input.all();\n\nconst normalizeBool = (v) => {\n return v === true || v === 'TRUE' || v === 'true';\n};\n\nconst targets = items\n .filter(item => {\n const d = item.json;\n if (!normalizeBool(d.enabled)) return false;\n if (d.status !== 'ready') return false;\n if (!d.scheduled_at) return false;\n if (d.posted_at) return false;\n\n const scheduledAt = new Date(d.scheduled_at);\n if (isNaN(scheduledAt.getTime())) return false;\n\n return scheduledAt <= now;\n })\n .sort((a, b) => {\n const ra = Number(a.json.row_number || 999999999);\n const rb = Number(b.json.row_number || 999999999);\n return ra - rb;\n });\n\nif (targets.length === 0) {\n return [{ json: { hasTargets: false, message: '投稿対象がありません' } }];\n}\n\nconst t = targets[0].json;\n\nreturn [{\n json: {\n hasTargets: true,\n row_number: t.row_number,\n id: t.id,\n x_post: t.x_post,\n retry_count: Number(t.retry_count || 0)\n }\n}];"
},
"id": "b0a1c003-filt-4a00-b000-000000000003",
"name": "投稿対象を抽出",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
448,
208
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 1
},
"conditions": [
{
"id": "cond-has-targets",
"leftValue": "={{ $json.hasTargets }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "true"
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "b0a1c004-if01-4a00-b000-000000000004",
"name": "投稿対象あり?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
672,
208
]
},
{
"parameters": {
"text": "={{ $json.x_post }}",
"additionalFields": {}
},
"id": "b0a1c005-xpst-4a00-b000-000000000005",
"name": "Xに投稿",
"type": "n8n-nodes-base.twitter",
"typeVersion": 2,
"position": [
896,
208
],
"credentials": {
"twitterOAuth2Api": {
"id": "O7Gd3i26YP3h7f5d",
"name": "X account"
}
}
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "1y4b4lTsrPmAYqUmSdXjqgVdX27sLYDz3eh0TiMYNhx0",
"mode": "list",
"cachedResultName": "X_posts_n8n_articles",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1y4b4lTsrPmAYqUmSdXjqgVdX27sLYDz3eh0TiMYNhx0/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 58828590,
"mode": "list",
"cachedResultName": "n8n_articles_posts",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1y4b4lTsrPmAYqUmSdXjqgVdX27sLYDz3eh0TiMYNhx0/edit#gid=58828590"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"row_number": "={{ $('投稿対象を抽出').item.json.row_number }}",
"status": "posted",
"posted_at": "={{ new Date().toISOString() }}",
"x_post_id": "={{ $json.id }}",
"updated_at": "={{ new Date().toISOString() }}"
},
"matchingColumns": [
"row_number"
],
"schema": [
{
"id": "id",
"displayName": "id",
"required": false,
"defaultMatch": true,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "status",
"displayName": "status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "title",
"displayName": "title",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "url",
"displayName": "url",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "summary",
"displayName": "summary",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "x_post",
"displayName": "x_post",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "enabled",
"displayName": "enabled",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "scheduled_at",
"displayName": "scheduled_at",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "posted_at",
"displayName": "posted_at",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "x_post_id",
"displayName": "x_post_id",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "last_error",
"displayName": "last_error",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "retry_count",
"displayName": "retry_count",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "updated_at",
"displayName": "updated_at",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "b0a1c006-succ-4a00-b000-000000000006",
"name": "成功:投稿済みに更新",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
1120,
208
],
"credentials": {
"googleSheetsOAuth2Api": {
"id": "fo3lC5VtAEDoLFxZ",
"name": "Google Sheets account"
}
}
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1,
2,
3,
4,
5
],
"triggerAtHour": 9,
"triggerAtMinute": 30
}
]
}
},
"id": "b0a1c001-sch1-4a00-b000-000000000001",
"name": "平日9:30投稿",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
208
]
}
],
"pinData": {},
"connections": {
"スプレッドシート読み込み": {
"main": [
[
{
"node": "投稿対象を抽出",
"type": "main",
"index": 0
}
]
]
},
"投稿対象を抽出": {
"main": [
[
{
"node": "投稿対象あり?",
"type": "main",
"index": 0
}
]
]
},
"投稿対象あり?": {
"main": [
[
{
"node": "Xに投稿",
"type": "main",
"index": 0
}
],
[]
]
},
"Xに投稿": {
"main": [
[
{
"node": "成功:投稿済みに更新",
"type": "main",
"index": 0
}
]
]
},
"平日9:30投稿": {
"main": [
[
{
"node": "スプレッドシート読み込み",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}5-2. n8nでら新しいワークフローを作成し、右上の「…」メニューから「Import from File」を選択し、保存したJSONファイルを選択します。

5-3. インポートが完了すると、以下の6つのノードが表示されます。

| ノード名 | 種別 | 役割 |
|---|---|---|
| 平日9:30投稿 | Schedule Trigger | 平日(月〜金)9:30にワークフローを起動 |
| スプレッドシート読み込み | Google Sheets | スプレッドシートから全投稿データを取得 |
| 投稿対象を抽出 | Code | 投稿条件に合致する1件を抽出 |
| 投稿対象あり? | IF | 投稿対象の有無で分岐 |
| Xに投稿 | Twitter | Xにテキストを投稿 |
| 成功:投稿済みに更新 | Google Sheets | ステータスとメタデータを更新 |
5-4. Google Sheetsの認証設定: 「スプレッドシート読み込み」ノードをクリックし、「Credential」欄で「Create New Credential」を選択します。GoogleアカウントでOAuth2認証を行います。

5-5. X(Twitter)の認証設定: 「Xに投稿」ノードをクリックし、「Credential」欄で「Create New Credential」を選択します。Step 3で取得した2つのキーを入力します。

ポイント: 「成功:投稿済みに更新」ノードは「スプレッドシート読み込み」と同じGoogle Sheetsクレデンシャルを使用します。
Step 6: スケジュールトリガーの設定
ワークフローの起動タイミングを確認・調整します。
6-1. 「平日9:30投稿」ノード(Schedule Trigger)をクリックします。

6-2. デフォルトでは以下のように設定されています。
| 設定項目 | 値 |
|---|---|
| 実行間隔 | Weekly(週次) |
| 曜日 | 月〜金(平日のみ) |
| 時刻 | 9:30 |

6-3. 投稿のタイミングを変更したい場合は、ここで曜日や時刻を自由にカスタマイズできます。たとえば「毎日12:00に投稿」や「月・水・金の18:00に投稿」といった設定も可能です。
Step 7: スプレッドシート読み込みノードの設定
Google Sheetsノードに、Step 4で作成したスプレッドシートを指定します。
7-1. 「スプレッドシート読み込み」ノードをクリックします。

7-2. 「Document」欄で、Step 4で作成した投稿管理スプレッドシートを選択します。

7-3. 「Sheet」欄で、投稿データが入力されているシートを選択します。

7-4. 同様に、「成功:投稿済みに更新」ノードにも同じスプレッドシートとシートを指定します。

ポイント: 2つの Google Sheets ノード(読み込みと更新)は同じスプレッドシート・シートを指定する必要があります。
Step 8: 投稿対象の抽出ロジック
「投稿対象を抽出」ノード(Code)は、スプレッドシートのデータから投稿すべき1件を自動で選び出します。このノードの内容はインポート済みのため、変更は不要です。

内部では以下の4つの条件でフィルタリングが行われています。
enabledがTRUE(有効な投稿のみ)statusがready(投稿準備完了のもの)scheduled_atが現在時刻以前(予定日時を過ぎている)posted_atが未設定(まだ投稿されていない)
条件に合致する投稿が複数ある場合は、行番号が最も小さい(最も上にある)1件のみが投稿対象になります。これにより、重複投稿を防止しつつ、登録した順番通りに投稿が行われます。
投稿対象がない場合は、「投稿対象あり?」ノード(IF)でfalse側に分岐し、何も実行せずワークフローが終了します。


Step 9: 動作確認とデプロイ
すべての設定が完了したら、テスト実行で動作を確認しましょう。
9-1. スプレッドシートに、status が ready、enabled が TRUE、scheduled_at が現在日時より前の投稿データが少なくとも1件あることを確認します。

9-2. n8nのキャンバス画面で「Execute Workflow」ボタンをクリックし、手動でワークフローを実行します。

9-3. 実行が成功すると、以下が確認できます。
- Xのタイムラインにテスト投稿が表示される
- スプレッドシートの該当行が以下のように更新される:
status→postedposted_at→ 投稿日時x_post_id→ XのポストIDupdated_at→ 更新日時
9-4. 動作確認が完了したら、ワークフロー右上の「Pubulish」を選択し、本番稼働を開始します。
ポイント: テスト投稿が不要になったら、Xのタイムラインから手動で削除しておきましょう。

よくある質問
- X APIは無料で使えますか?
-
2026年3月時点では、X APIは完全クレジット制(従量課金)に移行しており、無料での投稿はできません。1投稿あたり約$0.01(約1〜2円)程度の費用がかかります。Developer Portalで支払い方法(クレジットカード等)の登録してクレジットの購入が必要です。くれじっを購入しないと、投稿時に
402 Payment Requiredエラーが発生します。 - 1日に何件まで投稿できますか?
-
このワークフローはスケジュールトリガーの実行ごとに1件ずつ投稿する設計です。デフォルトでは平日9:30に1回実行されるため、1日1件の投稿になります。1日に複数件投稿したい場合は、
Schedule Triggerノードの実行タイミングを複数回に設定してください(例: 9:30と18:00の2回)。 - 画像付き投稿はできますか?
-
このワークフローはテキスト投稿に特化した構成です。画像付き投稿を行う場合は、
Twitterノードの「Additional Fields」で画像ファイルを指定する追加設定が必要になります。
つまずきやすいポイント
- 権限設定後にアクセストークンを再生成し忘れる: X Developer Portalでアプリの権限を「Read and write」に変更した場合、その後にアクセストークンを再生成する必要があります。変更前に生成したトークンは「読み取り」権限のままのため、投稿時に
403 Forbiddenエラーが出ます。 - X APIの料金体系を把握していない: 以前は無料枠がありましたが、2026年3月時点ではクレジット制(有料)に移行しています。支払い方法を登録せずに投稿しようとすると
402 Payment Requiredエラーが発生します。Developer Portalで支払い方法を登録してください。 - Google Sheetsのスプレッドシート・シート指定ミス: 「スプレッドシート読み込み」ノードと「成功:投稿済みに更新」ノードで、同じスプレッドシート・同じシートを指定する必要があります。片方だけ設定を変更すると、投稿後のステータス更新が別のシートに書き込まれてしまいます。
なかなかうまくいかないときは?
初めてX APIやn8nを使うと「Developer Portalの設定がわかりにくい」「OAuthキーの取得でつまずく」「投稿エラーの原因が特定できない」などで困る方もいます。また、「ワークフローの実行がうまくいかない」「スプレッドシートのステータスが更新されない」といった声も聞かれます。
そこで、おすすめしたいのが「ジドウカ」です。
ジドウカは、これまで合計800タスク以上の業務の自動化をしてきた実績のある法人専用の自動化サービスです。

業務の一部を”タスク単位”で自動化し、【月額1万円から】安定運用できるサブスクリプション型のサービスです。
技術のことが分からなくても「こういう作業をラクにしたい」と伝えるだけで自動化することが可能です。
「自分のやりたい自動化って本当に実現できるのかな…」という方には、
少額・短期間での「お試し開発」があるので、お気軽にご活用ください。
まとめ
本記事では、n8n × Google Sheets × X APIを使って、Xへの自動投稿ワークフローを構築する方法を解説しました。
- X Developer Portalでアプリを作成し、OAuth認証用の4つのキーを取得
- Google Sheetsで投稿テキスト・スケジュール・ステータスを一元管理
- n8nワークフローをインポートし、Google SheetsとXの認証情報を設定
- Schedule Triggerで平日9:30に自動起動し、投稿対象を抽出
- Twitterノードで投稿を実行し、Google Sheetsでステータスを自動更新
一度仕組みを構築すれば、スプレッドシートに投稿内容を登録するだけで、あとはn8nが毎日自動で投稿してくれます。手動でのSNS投稿作業から解放され、コンテンツの企画や本業に集中できるようになります。
「SNS投稿を効率化したい」「投稿忘れをなくしたい」という方は、ぜひ今回のワークフローを試してみてください。



への自動投稿を実現!Google-Sheets連携でSNS運用を効率化.png)