YouTube分析週間レポート

上級

これはMarket Research分野の自動化ワークフローで、17個のノードを含みます。主にCode, Merge, Telegram, HttpRequest, ScheduleTriggerなどのノードを使用。 YouTubeチャネル分析レポートを週次でTelegramへ自動送信

前提条件
  • Telegram Bot Token
  • ターゲットAPIの認証情報が必要な場合あり

カテゴリー

ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "id": "aPiq5niR5CX4IKG0",
  "meta": {
    "instanceId": "f7f67beee184b74727132a2cae80d905bf826da624b8008bfa0c397ee8879752",
    "templateCredsSetupCompleted": true
  },
  "name": "YouTube Analytics Weekly Report",
  "tags": [
    {
      "id": "os3elkx460WptGK8",
      "name": "abdulazizahwan",
      "createdAt": "2025-07-21T03:08:06.372Z",
      "updatedAt": "2025-07-21T03:08:06.372Z"
    }
  ],
  "nodes": [
    {
      "id": "08eb2d97-5306-47ce-8571-3ad837bc6c52",
      "name": "チャンネル概要",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        672,
        -720
      ],
      "parameters": {
        "url": "https://youtubeanalytics.googleapis.com/v2/reports ",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "ids",
              "value": "channel==MINE"
            },
            {
              "name": "startDate",
              "value": "={{ $now.minus({ weeks: 1 }).toISODate() }}"
            },
            {
              "name": "endDate",
              "value": "={{ $now.toISODate() }}"
            },
            {
              "name": "metrics",
              "value": "=views,estimatedMinutesWatched,averageViewDuration,likes,comments,subscribersGained,subscribersLost"
            },
            {
              "name": "dimensions",
              "value": "=day"
            },
            {
              "name": "sort",
              "value": "day"
            }
          ]
        },
        "nodeCredentialType": "googleOAuth2Api"
      },
      "credentials": {
        "googleOAuth2Api": {
          "id": "M5Kja7WVORPz6Bks",
          "name": "YouTube Credential"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "cea3c6b3-f849-420e-9df2-bcd55c9c3ff3",
      "name": "週間トップ動画",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        672,
        -496
      ],
      "parameters": {
        "url": "https://youtubeanalytics.googleapis.com/v2/reports ",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "ids",
              "value": "channel==MINE"
            },
            {
              "name": "startDate",
              "value": "={{ $now.minus({ weeks: 1 }).toISODate() }}"
            },
            {
              "name": "endDate",
              "value": "={{ $now.toISODate() }}"
            },
            {
              "name": "metrics",
              "value": "=views,estimatedMinutesWatched,averageViewDuration"
            },
            {
              "name": "dimensions",
              "value": "=video"
            },
            {
              "name": "sort",
              "value": "=-views"
            },
            {
              "name": "maxResults",
              "value": "=5"
            }
          ]
        },
        "nodeCredentialType": "googleOAuth2Api"
      },
      "credentials": {
        "googleOAuth2Api": {
          "id": "M5Kja7WVORPz6Bks",
          "name": "YouTube Credential"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "f87af746-24f4-43a5-82c1-400c5cf70b68",
      "name": "トラフィックソース",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        672,
        -144
      ],
      "parameters": {
        "url": "https://youtubeanalytics.googleapis.com/v2/reports ",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "ids",
              "value": "channel==MINE"
            },
            {
              "name": "startDate",
              "value": "={{ $now.minus({ weeks: 1 }).toISODate() }}"
            },
            {
              "name": "endDate",
              "value": "={{ $now.toISODate() }}"
            },
            {
              "name": "metrics",
              "value": "=views,estimatedMinutesWatched"
            },
            {
              "name": "dimensions",
              "value": "=insightTrafficSourceType"
            },
            {
              "name": "sort",
              "value": "views"
            }
          ]
        },
        "nodeCredentialType": "googleOAuth2Api"
      },
      "credentials": {
        "googleOAuth2Api": {
          "id": "M5Kja7WVORPz6Bks",
          "name": "YouTube Credential"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "2bf25aae-c867-46a8-8f4f-968553448659",
      "name": "視聴者属性",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        672,
        64
      ],
      "parameters": {
        "url": "https://youtubeanalytics.googleapis.com/v2/reports ",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "ids",
              "value": "channel==MINE"
            },
            {
              "name": "startDate",
              "value": "={{ $now.minus({ weeks: 1 }).toISODate() }}"
            },
            {
              "name": "endDate",
              "value": "={{ $now.toISODate() }}"
            },
            {
              "name": "metrics",
              "value": "=viewerPercentage"
            },
            {
              "name": "dimensions",
              "value": "=ageGroup,gender"
            },
            {
              "name": "sort",
              "value": "=ageGroup,gender"
            }
          ]
        },
        "nodeCredentialType": "googleOAuth2Api"
      },
      "credentials": {
        "googleOAuth2Api": {
          "id": "M5Kja7WVORPz6Bks",
          "name": "YouTube Credential"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "5c0f2672-7568-4db6-897e-665a4cce7382",
      "name": "テキストメッセージ送信",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2528,
        -272
      ],
      "webhookId": "0e7dd1e3-7c40-458e-9cee-c08a44ddb02a",
      "parameters": {
        "text": "={{ $json.text }}",
        "chatId": "-1001415788700",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "id": "qV4GRZZ4v7NAemUj",
          "name": "abdulazizahwan_Bot"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "227fce63-b178-485b-8f9c-d316820012be",
      "name": "IDをタイトルに変換",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1136,
        -352
      ],
      "parameters": {
        "url": "https://www.googleapis.com/youtube/v3/videos",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "part",
              "value": "snippet,statistics"
            },
            {
              "name": "id",
              "value": "={{$json.videoIdsCsv}}"
            }
          ]
        },
        "nodeCredentialType": "googleOAuth2Api"
      },
      "credentials": {
        "googleOAuth2Api": {
          "id": "M5Kja7WVORPz6Bks",
          "name": "YouTube Credential"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "a129db52-cddf-43dc-8028-ba6aa00953d8",
      "name": "視聴者属性フォーマッタ",
      "type": "n8n-nodes-base.code",
      "position": [
        960,
        64
      ],
      "parameters": {
        "jsCode": "// Input: 1 item berisi response JSON dari HTTP node di field 'data'\nconst res = items[0].json; // sesuaikan kalau output Anda beda\nconst headers = res.columnHeaders.map(h => h.name);\nconst out = (res.rows || []).map(r => {\n  const obj = {};\n  headers.forEach((h, i) => obj[h] = r[i]);\n  return obj;\n});\nreturn out.map(o => ({ json: o }));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "d84e6e62-be1f-46d2-9700-d086bfa7e3f9",
      "name": "トラフィックソースフォーマッタ",
      "type": "n8n-nodes-base.code",
      "position": [
        960,
        -144
      ],
      "parameters": {
        "jsCode": "// Input: 1 item berisi response JSON dari HTTP node di field 'data'\nconst res = items[0].json; // sesuaikan kalau output Anda beda\nconst headers = res.columnHeaders.map(h => h.name);\nconst out = (res.rows || []).map(r => {\n  const obj = {};\n  headers.forEach((h, i) => obj[h] = r[i]);\n  return obj;\n});\nreturn out.map(o => ({ json: o }));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "34965865-7bc9-462c-812d-9f27b230dca9",
      "name": "週間トップ動画フォーマッタ",
      "type": "n8n-nodes-base.code",
      "position": [
        960,
        -496
      ],
      "parameters": {
        "jsCode": "// Ambil data dari node sebelumnya\nconst res = items[0].json;\n\n// Ambil header kolom\nconst headers = res.columnHeaders.map(h => h.name);\n\n// Ubah rows jadi array of object\nconst parsed = (res.rows || []).map(r => {\n  const obj = {};\n  headers.forEach((h, i) => obj[h] = r[i]);\n\n  // Rename views -> views_weekly\n  if (obj.views !== undefined) {\n    obj.views_weekly = obj.views;\n    delete obj.views;\n  }\n\n  return obj;\n});\n\n// Ambil hanya kolom video (ID)\nconst ids = parsed.map(v => v.video);\n\n// Gabungkan jadi string CSV\nconst csv = ids.join(',');\n\n// Return satu item dengan field videoIdsCsv + juga parsed rows\nreturn [{\n  json: {\n    videoIdsCsv: csv,\n    topVideos: parsed\n  }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "adc07ff7-d09e-41f5-9635-2314d9911f45",
      "name": "チャンネル概要フォーマッタ",
      "type": "n8n-nodes-base.code",
      "position": [
        960,
        -720
      ],
      "parameters": {
        "jsCode": "// Input: 1 item berisi response JSON dari HTTP node di field 'data'\nconst res = items[0].json; // sesuaikan kalau output Anda beda\nconst headers = res.columnHeaders.map(h => h.name);\nconst out = (res.rows || []).map(r => {\n  const obj = {};\n  headers.forEach((h, i) => obj[h] = r[i]);\n  return obj;\n});\nreturn out.map(o => ({ json: o }));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "3d7fa276-77c3-46a1-9841-231d7f49f6cb",
      "name": "週間視聴数と全期間視聴数の結合",
      "type": "n8n-nodes-base.merge",
      "position": [
        1312,
        -480
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "0e8c5e71-2f95-4db0-947a-3eeaf2636b4c",
      "name": "結合ノード1 2 3",
      "type": "n8n-nodes-base.merge",
      "position": [
        1728,
        -480
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "2acfbe97-ce35-48e5-8a16-6ddc9331465a",
      "name": "結合ノード1 2 3 4",
      "type": "n8n-nodes-base.merge",
      "position": [
        1952,
        -272
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "618d7960-3e49-4657-bed9-e71e81df10a1",
      "name": "全出力フォーマッタ",
      "type": "n8n-nodes-base.code",
      "position": [
        2144,
        -272
      ],
      "parameters": {
        "jsCode": "// Ambil semua item hasil merge\nconst arr = items.map(i => i.json);\n\nconst result = {\n  overview: [],\n  topVideos: [],\n  trafficSources: [],\n  audience: []\n};\n\nfor (const item of arr) {\n  // Cek apakah ini Overview (punya key 'day')\n  if (item.day) {\n    result.overview.push(item);\n  }\n  // Cek apakah ini objek gabungan TopVideos (ada 'items' dan 'topVideos')\n  else if (item.items && item.topVideos) {\n    \n    // Ini bagian yang diubah\n    result.topVideos = item.items.map(videoDetail => {\n      // 1. Cari data analitik yang cocok berdasarkan ID video\n      const analyticsData = item.topVideos.find(\n        analyticsVideo => analyticsVideo.video === videoDetail.id\n      );\n\n      // 2. Gabungkan data dalam objek baru\n      return {\n        id: videoDetail.id,\n        title: videoDetail.snippet.title,\n        views_alltime: videoDetail.statistics.viewCount, // Total views seumur hidup\n        views_weekly: analyticsData ? analyticsData.views_weekly : 0, // Views mingguan dari data analitik\n        likes: videoDetail.statistics.likeCount,\n        comments: videoDetail.statistics.commentCount,\n        thumbnail: videoDetail.snippet.thumbnails?.default?.url\n      };\n    });\n  }\n  // Cek apakah ini Traffic Source (ada 'insightTrafficSourceType')\n  else if (item.insightTrafficSourceType) {\n    result.trafficSources.push(item);\n  }\n  // Cek apakah ini Audience (ada 'ageGroup')\n  else if (item.ageGroup) {\n    result.audience.push(item);\n  }\n}\n\nreturn [{ json: result }];"
      },
      "typeVersion": 2
    },
    {
      "id": "fd65cc2a-ed80-4382-814e-da36f3e820e2",
      "name": "Telegram メッセージフォーマッタ",
      "type": "n8n-nodes-base.code",
      "position": [
        2336,
        -272
      ],
      "parameters": {
        "jsCode": "const data = items[0].json;\n\n// Ambil hanya 7 hari terakhir\nconst last7 = data.overview.slice(-7);\n\n// Hitung total & rata-rata\nconst totalViews = last7.reduce((sum, d) => sum + d.views, 0);\nconst totalLikes = last7.reduce((sum, d) => sum + d.likes, 0);\nconst totalComments = last7.reduce((sum, d) => sum + d.comments, 0);\nconst totalSubsGained = last7.reduce((sum, d) => sum + d.subscribersGained, 0);\nconst totalSubsLost = last7.reduce((sum, d) => sum + d.subscribersLost, 0);\nconst avgDuration = Math.round(\n  last7.reduce((sum, d) => sum + d.averageViewDuration, 0) / last7.length\n);\n\n// Ambil rentang tanggal\nconst start = last7[0].day;\nconst end = last7[last7.length - 1].day;\n\nlet text = `📊 *Channel Summary (Last 7 days)*\\n`;\ntext += `Periode: ${start} ➝ ${end}\\n`;\ntext += `👁️ Views: ${totalViews}\\n`;\ntext += `⏱️ Avg. View Duration: ${avgDuration} detik\\n`;\ntext += `👍 Likes: ${totalLikes} | 💬 Comments: ${totalComments}\\n`;\ntext += `👥 Subs +${totalSubsGained} / -${totalSubsLost}\\n\\n`;\n\n// Top 5 Videos\ntext += `🔥 *Top 5 Videos*\\n`;\nfor (const v of data.topVideos.slice(0, 5)) {\n  // --- BARIS INI YANG DIUBAH ---\n  text += `- ${v.title}\\n  📈 ${v.views_weekly} (Last Week) | 👁️ ${v.views_alltime} (Total) | 👍 ${v.likes} | 💬 ${v.comments}\\n`;\n}\n\n// Top 3 Traffic Sources\ntext += `\\n🚦 *Top 3 Sources*\\n`;\nconst sortedSources = data.trafficSources.sort((a,b)=>b.views - a.views);\nfor (const s of sortedSources.slice(0, 3)) {\n  text += `- ${s.insightTrafficSourceType}: ${s.views} views\\n`;\n}\n\n// Audience Demography (top 3)\ntext += `\\n👥 *Top Audience*\\n`;\nconst sortedAudience = data.audience.sort((a,b)=>b.viewerPercentage - a.viewerPercentage);\nfor (const aud of sortedAudience.slice(0, 3)) {\n  text += `- ${aud.ageGroup} ${aud.gender}: ${aud.viewerPercentage}%\\n`;\n}\n\nreturn [{ json: { text } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "32373234-a574-4aae-a877-2f929952bf8c",
      "name": "結合ノード1 2",
      "type": "n8n-nodes-base.merge",
      "position": [
        1456,
        -704
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "70a6943e-1f85-4536-a678-96d1106244d3",
      "name": "毎週日曜6時に実行",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        96,
        -240
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtHour": 6
            }
          ]
        }
      },
      "typeVersion": 1.2
    }
  ],
  "active": true,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "94e8065d-cf9b-4a01-8434-3f29cf4ea43b",
  "connections": {
    "f87af746-24f4-43a5-82c1-400c5cf70b68": {
      "main": [
        [
          {
            "node": "d84e6e62-be1f-46d2-9700-d086bfa7e3f9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "08eb2d97-5306-47ce-8571-3ad837bc6c52": {
      "main": [
        [
          {
            "node": "adc07ff7-d09e-41f5-9635-2314d9911f45",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "32373234-a574-4aae-a877-2f929952bf8c": {
      "main": [
        [
          {
            "node": "0e8c5e71-2f95-4db0-947a-3eeaf2636b4c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "cea3c6b3-f849-420e-9df2-bcd55c9c3ff3": {
      "main": [
        [
          {
            "node": "34965865-7bc9-462c-812d-9f27b230dca9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "227fce63-b178-485b-8f9c-d316820012be": {
      "main": [
        [
          {
            "node": "3d7fa276-77c3-46a1-9841-231d7f49f6cb",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "0e8c5e71-2f95-4db0-947a-3eeaf2636b4c": {
      "main": [
        [
          {
            "node": "2acfbe97-ce35-48e5-8a16-6ddc9331465a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2acfbe97-ce35-48e5-8a16-6ddc9331465a": {
      "main": [
        [
          {
            "node": "618d7960-3e49-4657-bed9-e71e81df10a1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "618d7960-3e49-4657-bed9-e71e81df10a1": {
      "main": [
        [
          {
            "node": "fd65cc2a-ed80-4382-814e-da36f3e820e2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2bf25aae-c867-46a8-8f4f-968553448659": {
      "main": [
        [
          {
            "node": "a129db52-cddf-43dc-8028-ba6aa00953d8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "70a6943e-1f85-4536-a678-96d1106244d3": {
      "main": [
        [
          {
            "node": "08eb2d97-5306-47ce-8571-3ad837bc6c52",
            "type": "main",
            "index": 0
          },
          {
            "node": "cea3c6b3-f849-420e-9df2-bcd55c9c3ff3",
            "type": "main",
            "index": 0
          },
          {
            "node": "f87af746-24f4-43a5-82c1-400c5cf70b68",
            "type": "main",
            "index": 0
          },
          {
            "node": "2bf25aae-c867-46a8-8f4f-968553448659",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d84e6e62-be1f-46d2-9700-d086bfa7e3f9": {
      "main": [
        [
          {
            "node": "0e8c5e71-2f95-4db0-947a-3eeaf2636b4c",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "adc07ff7-d09e-41f5-9635-2314d9911f45": {
      "main": [
        [
          {
            "node": "32373234-a574-4aae-a877-2f929952bf8c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "34965865-7bc9-462c-812d-9f27b230dca9": {
      "main": [
        [
          {
            "node": "227fce63-b178-485b-8f9c-d316820012be",
            "type": "main",
            "index": 0
          },
          {
            "node": "3d7fa276-77c3-46a1-9841-231d7f49f6cb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fd65cc2a-ed80-4382-814e-da36f3e820e2": {
      "main": [
        [
          {
            "node": "5c0f2672-7568-4db6-897e-665a4cce7382",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a129db52-cddf-43dc-8028-ba6aa00953d8": {
      "main": [
        [
          {
            "node": "2acfbe97-ce35-48e5-8a16-6ddc9331465a",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "3d7fa276-77c3-46a1-9841-231d7f49f6cb": {
      "main": [
        [
          {
            "node": "32373234-a574-4aae-a877-2f929952bf8c",
            "type": "main",
            "index": 1
          }
        ]
      ]
    }
  }
}
よくある質問

このワークフローの使い方は?

上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。

このワークフローはどんな場面に適していますか?

上級 - 市場調査

有料ですか?

このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。

ワークフロー情報
難易度
上級
ノード数17
カテゴリー1
ノードタイプ5
難易度説明

上級者向け、16ノード以上の複雑なワークフロー

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34