「自社のYouTubeチャンネルの視聴回数やチャンネル登録者数を毎日手動でメモしている」「競合チャンネルの動画本数や再生数を調査するのに時間がかかる」——そんな担当者に向けて、Google Apps Script(GAS)とYouTube Data APIを組み合わせて、動画情報を自動取得・スプレッドシートへ記録する仕組みを作ります。
YouTube Data APIはGoogleが公式提供している無料APIです。GASと組み合わせることで、プログラミング未経験者でも比較的短時間でYouTube情報の自動収集ツールが完成します。本記事ではAPIキー取得から実際に動くスクリプト作成・自動実行まで一気通貫で解説します。
この記事でできること
- YouTube Data APIキーの取得とGASへの設定
- 指定チャンネルの最新動画一覧(タイトル・再生回数・いいね数・投稿日時)をスプレッドシートに自動記録
- 複数チャンネルの競合調査データを毎日自動収集
- 毎朝9時に自動実行するトリガー設定
事前準備(15分)
作業を始める前に以下を用意してください。
- Googleアカウント(Gmail)
- Google Cloud Consoleへのアクセス権限
- 調査対象のYouTubeチャンネルID(後述の手順で確認できます)
チャンネルIDの調べ方:YouTubeでチャンネルページを開き、URLに含まれる「@ハンドル名」か「UC〜」から始まる文字列がチャンネルIDです。例:https://www.youtube.com/@channelnameの場合は、チャンネルページ右クリック→「ページのソースを表示」でchannel_idを検索すると「UC〜」形式のIDが確認できます。
STEP 1:Google Cloud ConsoleでYouTube Data API v3を有効化してAPIキーを取得する
GASからYouTube APIを呼び出すには、まずGoogle Cloud側でAPIキーを発行する必要があります。
- 1-1. Google Cloud Consoleにアクセスし、プロジェクトを作成(または既存プロジェクトを選択)
- 1-2. 左メニュー「APIとサービス」→「ライブラリ」→検索欄に「YouTube Data API v3」と入力→「有効にする」をクリック
- 1-3. 「APIとサービス」→「認証情報」→「認証情報を作成」→「APIキー」を選択
- 1-4. 生成されたAPIキーをコピーして控えておく(例:
AIzaSy〜〜〜〜〜〜〜〜〜〜)
セキュリティ上の注意:APIキーはソースコードに直接書き込まず、GASのスクリプトプロパティ(設定ファイル)に保存します。これにより、誰かにコードを見られてもキーが漏洩しません。
STEP 2:スプレッドシートとGASプロジェクトを作成する
データを記録するスプレッドシートを作成し、GASエディタを開きます。
- 2-1. Googleドライブで新規スプレッドシートを作成し、シート名を「動画データ」に変更
- 2-2. A1〜H1にヘッダーを入力:
取得日時/チャンネル名/動画タイトル/動画ID/投稿日時/再生回数/いいね数/コメント数 - 2-3. スプレッドシートのメニュー「拡張機能」→「Apps Script」を開く
- 2-4. 左メニューの「プロジェクトの設定」(歯車アイコン)→「スクリプトプロパティ」→「プロパティを追加」をクリック
- 2-5. プロパティ名:
YOUTUBE_API_KEY、値:STEP 1で取得したAPIキー を入力して保存
STEP 3:GASスクリプトを作成する
GASエディタのコード.gsに以下のコードを貼り付けます。
// YouTube Data APIで動画情報を自動取得してスプレッドシートに記録するスクリプト
const CHANNEL_IDS = [
'UCxxxxxxxxxxxxxxxxxxxxxxxx', // 調査したいチャンネルID1
'UCyyyyyyyyyyyyyyyyyyyyyy', // 調査したいチャンネルID2
];
const MAX_RESULTS = 10; // 1チャンネルあたり取得する動画数
function fetchYouTubeData() {
const apiKey = PropertiesService.getScriptProperties().getProperty('YOUTUBE_API_KEY');
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('動画データ');
const now = new Date();
const timestamp = Utilities.formatDate(now, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm');
CHANNEL_IDS.forEach(channelId => {
// チャンネル情報を取得
const channelUrl = `https://www.googleapis.com/youtube/v3/channels?part=snippet&id=${channelId}&key=${apiKey}`;
const channelRes = UrlFetchApp.fetch(channelUrl);
const channelData = JSON.parse(channelRes.getContentText());
if (!channelData.items || channelData.items.length === 0) {
console.log(`チャンネルが見つかりません: ${channelId}`);
return;
}
const channelName = channelData.items[0].snippet.title;
// 最新動画一覧を取得
const searchUrl = `https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=${channelId}&maxResults=${MAX_RESULTS}&order=date&type=video&key=${apiKey}`;
const searchRes = UrlFetchApp.fetch(searchUrl);
const searchData = JSON.parse(searchRes.getContentText());
if (!searchData.items) return;
// 動画IDリストで統計情報を一括取得
const videoIds = searchData.items.map(item => item.id.videoId).join(',');
const statsUrl = `https://www.googleapis.com/youtube/v3/videos?part=statistics,snippet&id=${videoIds}&key=${apiKey}`;
const statsRes = UrlFetchApp.fetch(statsUrl);
const statsData = JSON.parse(statsRes.getContentText());
statsData.items.forEach(video => {
const title = video.snippet.title;
const videoId = video.id;
const publishedAt = Utilities.formatDate(new Date(video.snippet.publishedAt), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm');
const viewCount = video.statistics.viewCount || '0';
const likeCount = video.statistics.likeCount || '0';
const commentCount = video.statistics.commentCount || '0';
sheet.appendRow([
timestamp,
channelName,
title,
videoId,
publishedAt,
parseInt(viewCount),
parseInt(likeCount),
parseInt(commentCount)
]);
});
console.log(`${channelName}の動画${statsData.items.length}件を記録しました`);
});
}
// 【おまけ】チャンネル登録者数・総再生回数もシートに記録する関数
function fetchChannelStats() {
const apiKey = PropertiesService.getScriptProperties().getProperty('YOUTUBE_API_KEY');
const ss = SpreadsheetApp.getActiveSpreadsheet();
let statsSheet = ss.getSheetByName('チャンネル統計');
if (!statsSheet) {
statsSheet = ss.insertSheet('チャンネル統計');
statsSheet.appendRow(['取得日時', 'チャンネル名', 'チャンネルID', '登録者数', '総動画数', '総再生回数']);
}
const now = new Date();
const timestamp = Utilities.formatDate(now, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm');
CHANNEL_IDS.forEach(channelId => {
const url = `https://www.googleapis.com/youtube/v3/channels?part=snippet,statistics&id=${channelId}&key=${apiKey}`;
const res = UrlFetchApp.fetch(url);
const data = JSON.parse(res.getContentText());
if (!data.items || data.items.length === 0) return;
const item = data.items[0];
statsSheet.appendRow([
timestamp,
item.snippet.title,
channelId,
parseInt(item.statistics.subscriberCount || 0),
parseInt(item.statistics.videoCount || 0),
parseInt(item.statistics.viewCount || 0)
]);
});
}
コードの解説:
CHANNEL_IDS:調査したいチャンネルIDの配列。複数設定可能UrlFetchApp.fetch():GASからHTTP通信でAPIを呼び出すメソッドPropertiesService.getScriptProperties():スクリプトプロパティからAPIキーを安全に読み込むsheet.appendRow():スプレッドシートの末尾に1行追加する
STEP 4:動作確認と毎日自動実行するトリガーを設定する
動作テスト
- GASエディタ上部の関数選択ドロップダウンで「fetchYouTubeData」を選択
- ▶ ボタン(実行)をクリック
- 初回は「承認が必要です」というポップアップが出るので「権限を確認」→Googleアカウントで許可
- スプレッドシート「動画データ」シートにデータが追記されたら成功
トリガー設定(毎朝9時に自動実行)
- GASエディタ左メニュー「トリガー」(時計アイコン)→「トリガーを追加」
- 実行する関数:
fetchYouTubeData - イベントのソース:
時間主導型 - 時間ベースのトリガーのタイプ:
日付ベースのタイマー - 時刻:
午前9時〜10時→「保存」
トラブルシュートチェックリスト
- ❌
Exception: Request failed for...returned code 403→ APIキーが正しくコピーされていない、またはYouTube Data API v3が有効化されていない。Cloud Consoleで確認を - ❌
チャンネルが見つかりません→ チャンネルIDが間違っている。「UC〜」から始まるID形式かハンドル名(@なし)で再確認 - ❌
TypeError: Cannot read property...of null→ API割り当て上限(無料枠:1日10,000ユニット)に達している可能性。翌日リトライするか、Google Cloud Consoleでクォータを確認 - ❌ スプレッドシートに書き込まれない→ シート名が「動画データ」と完全一致しているか確認(全角スペース等に注意)
応用:さらに便利にする拡張アイデア
- Slack通知と組み合わせる:特定動画の再生回数が前日比10%以上伸びたらSlackに自動通知。急上昇コンテンツをいち早く把握できる
- 競合チャンネルの週次レポートをGmailで自動送信:毎週月曜に先週の競合データをHTML形式のメールで自動送信。会議資料作成が不要になる
- Googleデータポータル(Looker Studio)でダッシュボード化:蓄積したスプレッドシートデータをLooker Studioに接続し、再生数推移グラフを自動更新するダッシュボードを作れる
- キーワード検索で競合動画を自動収集:searchエンドポイントのqパラメータに検索ワードを設定すると、競合他社の動画を横断調査できる
まとめ
GASとYouTube Data API v3を組み合わせることで、面倒な手動調査を完全自動化できます。一度セットアップすれば毎朝最新のデータが自動でスプレッドシートに蓄積されるため、コンテンツ戦略の意思決定スピードが格段に上がります。
- APIキーはスクリプトプロパティに保存し、セキュリティを確保する
- 1回の実行で複数チャンネルを一括調査でき、競合分析にも活用できる
- トリガーを設定すれば毎朝自動実行され、手間ゼロでデータが蓄積される
- Slack通知やLooker Studioと組み合わせることで、さらに実用的なツールに発展できる
「自社のチャンネルに加えて競合チャンネルも一緒に監視したい」「データを分析してレポートまで自動化したい」など、もう一歩進んだ仕組みを作りたい場合はお気軽にご相談ください。


コメントを残す