YouTube APIを使って動画情報をスプレッドシートにまとめる方法:GASで自動化!

今回は、前回の記事で設定したAPIキーを使い、GASを活用してYouTubeに動画情報をスプレッドシートにまとめる方法をご紹介します。

YouTube APIを使うことで、自分のチャンネルの分析や、お気に入りのチャンネルの動画情報をスプレッドシートに簡単にまとめることができます。

手作業での入力が不要となり、動画タイトル、公開日、チャンネルタイトル、動画URLなどのデータを効率的に取得可能です。

目次

完成イメージ

指定したチャンネルID・動画本数をもとに、スプレッドシートに一覧表示


各動画の基本情報がスプレッドシートに一覧表示され、視覚的にわかりやすく整理できます。

YouTube APIキーの準備

YouTube Data API v3のAPIキーを取得し、スクリプトプロパティに設定します。
スクリプトプロパティ名 例:「YOUTUBE_DATA_API_KEY」
こちらの記事を参照)

手順

STEP
スプレッドシートを準備

B1セルにYouTubeチャンネルIDを入力します。

B2セルには取得する開始位置、B3セルには取得終了位置を記入します。

例えば、1〜10と設定すると最新動画から10件を取得します。

5行目にはヘッダーとして、以下項目を入力します。

項目の入力(例)

入力内容
A5動画ID
B5タイトル
C5公開日
D5サムネイル画像
E5チャンネルタイトル
F5視聴回数
G5いいね数
H5動画の長さ
I5動画URL
STEP
GASエディタを開く
画像に alt 属性が指定されていません。ファイル名: GAS.png

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。

STEP
GASスクリプトの作成

function myFunction(){

}

が最初から入っているため、消去して以下のスクリプトを貼り付けます。

function fetchAndWriteYouTubeData() {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("動画情報");
    if (!sheet) {
        Logger.log("シート「動画情報」が見つかりません。");
        return;
    }

    // スクリプトプロパティからAPIキーを取得
    var apiKey = PropertiesService.getScriptProperties().getProperty('YOUTUBE_DATA_API_KEY');
    Logger.log("API Key: " + apiKey);
    
    // B1セルからチャンネルIDを取得
    var channelId = sheet.getRange("B1").getValue();
    Logger.log("Channel ID: " + channelId);
    
    // B2セルとB3セルから取得範囲を設定
    var startIndex = parseInt(sheet.getRange("B2").getValue()) || 1;
    var endIndex = parseInt(sheet.getRange("B3").getValue()) || 10;
    var maxResults = Math.min(endIndex - startIndex + 1, 100);
    Logger.log(`Start Index: ${startIndex}, End Index: ${endIndex}`);

    // YouTube Data APIのURL
    var baseUrl = `https://www.googleapis.com/youtube/v3/search?key=${apiKey}&channelId=${channelId}&part=snippet&order=date&type=video&maxResults=100`;
    
    var videos = []; // 動画データの格納
    var nextPageToken = '';
    var totalFetched = 0;

    // ページネーションを使用して動画データを取得
    while (nextPageToken !== null && totalFetched < endIndex) {
        var url = baseUrl + (nextPageToken ? `&pageToken=${nextPageToken}` : '');
        var response = UrlFetchApp.fetch(url);
        var data = JSON.parse(response.getContentText());
        if (!data.items) {
            Logger.log("データが取得できませんでした。");
            break;
        }

        videos = videos.concat(data.items);
        totalFetched += data.items.length;

        nextPageToken = data.nextPageToken || null;
        Logger.log(`Fetched ${data.items.length} videos, Total fetched: ${totalFetched}`);
    }

    // 必要な範囲を抽出し、動画IDを取得
    var videoIds = videos.slice(startIndex - 1, endIndex).map(item => item.id.videoId).join(',');

    // videosエンドポイントで詳細情報(視聴回数、いいね数、動画の長さ)を取得
    var detailsUrl = `https://www.googleapis.com/youtube/v3/videos?key=${apiKey}&id=${videoIds}&part=snippet,contentDetails,statistics`;
    var detailsResponse = UrlFetchApp.fetch(detailsUrl);
    var detailsData = JSON.parse(detailsResponse.getContentText());

    // 次の書き込み開始行を取得
    var lastRow = sheet.getLastRow();

    // スプレッドシートにデータを書き込む
    detailsData.items.forEach(function(item, index) {
        var videoId = item.id;
        var title = item.snippet.title;
        var publishedAt = item.snippet.publishedAt;
        var thumbnailUrl = item.snippet.thumbnails.default.url; // デフォルトサムネイルURL
        var channelTitle = item.snippet.channelTitle;
        var viewCount = item.statistics.viewCount;
        var likeCount = item.statistics.likeCount;
        var videoUrl = `https://www.youtube.com/watch?v=${videoId}`;

        // ISO 8601の動画の長さをフォーマット
        var duration = formatDuration(item.contentDetails.duration);

        Logger.log(`Writing to row ${lastRow + index + 1}: ${title}`);

        sheet.getRange(lastRow + index + 1, 1).setValue(videoId);         // A列: 動画ID
        sheet.getRange(lastRow + index + 1, 2).setValue(title);           // B列: タイトル
        sheet.getRange(lastRow + index + 1, 3).setValue(publishedAt);     // C列: 公開日
        sheet.getRange(lastRow + index + 1, 4).setFormula(`=IMAGE("${thumbnailUrl}")`); // D列: サムネイル
        sheet.getRange(lastRow + index + 1, 5).setValue(channelTitle);    // E列: チャンネルタイトル
        sheet.getRange(lastRow + index + 1, 6).setValue(viewCount);       // F列: 視聴回数
        sheet.getRange(lastRow + index + 1, 7).setValue(likeCount);       // G列: いいね数
        sheet.getRange(lastRow + index + 1, 8).setValue(duration);        // H列: 動画の長さ
        sheet.getRange(lastRow + index + 1, 9).setValue(videoUrl);        // I列: 動画URL
    });
}

// ISO 8601形式の動画長さを「HH:MM:SS」に変換
function formatDuration(duration) {
    var matches = duration.match(/PT(\d+H)?(\d+M)?(\d+S)?/);
    var hours = (matches[1] ? matches[1].replace('H', '') : '00').padStart(2, '0');
    var minutes = (matches[2] ? matches[2].replace('M', '') : '00').padStart(2, '0');
    var seconds = (matches[3] ? matches[3].replace('S', '') : '00').padStart(2, '0');
    return `${hours}:${minutes}:${seconds}`;
}
スクリプトの説明
シートの確認とAPIキーの取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("動画情報");
if (!sheet) {
    Logger.log("シート「動画情報」が見つかりません。");
    return;
}

// スクリプトプロパティからAPIキーを取得
var apiKey = PropertiesService.getScriptProperties().getProperty('YOUTUBE_DATA_API_KEY');
Logger.log("API Key: " + apiKey);
  • 「動画情報」という名前のシートを取得し、存在しなければログメッセージを出して終了します。
  • スクリプトプロパティから「YouTube Data API」キーを取得し、これを後続のAPIリクエストに使用します。
チャンネルIDと取得範囲の設定
// B1セルからチャンネルIDを取得
var channelId = sheet.getRange("B1").getValue();
Logger.log("Channel ID: " + channelId);
    
// B2セルとB3セルから取得範囲を設定
var startIndex = parseInt(sheet.getRange("B2").getValue()) || 1;
var endIndex = parseInt(sheet.getRange("B3").getValue()) || 10;
  • B1セルからチャンネルIDを取得し、APIリクエストの対象とします。
  • B2セルB3セルで指定された範囲をもとに、取得する動画の開始と終了の位置を設定します。
YouTube APIで動画情報を取得
// YouTube Data APIのURL
var baseUrl = `https://www.googleapis.com/youtube/v3/search?key=${apiKey}&channelId=${channelId}&part=snippet&order=date&type=video&maxResults=100`;

    videos = videos.concat(data.items);
    totalFetched += data.items.length;

    nextPageToken = data.nextPageToken || null;
    Logger.log(`Fetched ${data.items.length} videos, Total fetched: ${totalFetched}`);
    }
  • YouTube Data APIの検索エンドポイントを使用し、チャンネルの動画を最大100件まで取得します。
  • ページネーションを利用して、指定した範囲の動画が取得されるまで繰り返します。
動画IDのリスト作成と動画の詳細情報取得
// 必要な範囲を抽出し、動画IDを取得
var videoIds = videos.slice(startIndex - 1, endIndex).map(item => item.id.videoId).join(',');

// videosエンドポイントで詳細情報(視聴回数、いいね数、動画の長さ)を取得
var detailsUrl = `https://www.googleapis.com/youtube/v3/videos?key=${apiKey}&id=${videoIds}&part=snippet,contentDetails,statistics`;
var detailsResponse = UrlFetchApp.fetch(detailsUrl);
var detailsData = JSON.parse(detailsResponse.getContentText());
  • 取得した動画の中から指定された範囲の動画IDをリスト化し、動画の詳細(視聴回数、いいね数、動画の長さなど)をまとめて取得します。
スプレッドシートへの書き込み
// スプレッドシートにデータを書き込む
    detailsData.items.forEach(function(item, index) {
        var videoId = item.id;
        var title = item.snippet.title;
        var publishedAt = item.snippet.publishedAt;
        var thumbnailUrl = item.snippet.thumbnails.default.url; // デフォルトサムネイルURL
        var channelTitle = item.snippet.channelTitle;
        var viewCount = item.statistics.viewCount;
        var likeCount = item.statistics.likeCount;
        var videoUrl = `https://www.youtube.com/watch?v=${videoId}`;

        // ISO 8601の動画の長さをフォーマット
        var duration = formatDuration(item.contentDetails.duration);

        Logger.log(`Writing to row ${lastRow + index + 1}: ${title}`);

        sheet.getRange(lastRow + index + 1, 1).setValue(videoId);         // A列: 動画ID
        sheet.getRange(lastRow + index + 1, 2).setValue(title);           // B列: タイトル
        sheet.getRange(lastRow + index + 1, 3).setValue(publishedAt);     // C列: 公開日
        sheet.getRange(lastRow + index + 1, 4).setFormula(`=IMAGE("${thumbnailUrl}")`); // D列: サムネイル
        sheet.getRange(lastRow + index + 1, 5).setValue(channelTitle);    // E列: チャンネルタイトル
        sheet.getRange(lastRow + index + 1, 6).setValue(viewCount);       // F列: 視聴回数
        sheet.getRange(lastRow + index + 1, 7).setValue(likeCount);       // G列: いいね数
        sheet.getRange(lastRow + index + 1, 8).setValue(duration);        // H列: 動画の長さ
        sheet.getRange(lastRow + index + 1, 9).setValue(videoUrl);        // I列: 動画URL
    });
}
  • A列からI列までの各セルに動画情報を順に書き込みます。
  • =IMAGE()関数を使い、サムネイル画像をセル内に表示させます。
  • 書き込み後、次の行に続けてデータが追記されるため、複数回に分けて動画情報を取得する場合も既存のデータが上書きされません。
動画の長さを「HH:MM」形式に変換
// ISO 8601形式の動画長さを「HH:MM:SS」に変換
function formatDuration(duration) {
    var matches = duration.match(/PT(\d+H)?(\d+M)?(\d+S)?/);
    var hours = (matches[1] ? matches[1].replace('H', '') : '00').padStart(2, '0');
    var minutes = (matches[2] ? matches[2].replace('M', '') : '00').padStart(2, '0');
    var seconds = (matches[3] ? matches[3].replace('S', '') : '00').padStart(2, '0');
    return `${hours}:${minutes}:${seconds}`;
}
  • 動画の長さはISO 8601形式で取得されるため、「HH:MM」形式に変換する関数を用意しています。
  • この関数で取得した動画の再生時間を見やすい形式に変換し、スプレッドシートに書き込みます。
STEP
スクリプトを保存

スクリプトを書いたら、名前をつけて保存します。

(例:「YouTubeデータ取得」)

STEP
スクリプトを実行

スクリプトを実行すると、YouTubeデータを取得します。

初めてそのスクリプトを実行する場合は権限の確認が必要です。

そのため、『権限を確認』を押します。

許可の詳細手順

「詳細」をクリックします。

無題のプロジェクト(安全ではないページ)に移動」をクリックします。

許可」をクリックします。

STEP
スプレッドシートに一覧として表示

スプレッドシートには、指定した本数の動画が新しい順に一覧表示されます。

B2セルB3セルに取得したい動画の範囲(開始と終了)を指定することで、異なる範囲の動画も取得できます。

例えば、最初に1〜10本を取得し、その後に11〜20本を指定してスクリプトを実行すると、すでに取得したデータの下に新しい動画情報が追加されます。

YouTube API使用時の注意事項

APIのクォータ制限に注意
  • YouTube Data APIには、1日10,000クォータの使用制限があります。
  • 特に詳細情報(視聴回数やいいね数など)を取得するリクエストは1つの動画に対して、5クォータ消費します。
  • 例えば100本の動画の詳細情報を取得する場合、100本 × 5クォータ = 500クォータが消費されます。
  • 1度に大量のデータを取得すると上限に達しやすくなります。
1回で取得する動画の本数を調整
  • 1回のスクリプト実行で取得する動画本数は50〜100本程度が適切です。
  • スプレッドシートのB2、B3セルで範囲を指定し、複数回に分けてデータを収集すると効率的です。
API使用状況のチェック

API使用状況はGoogle Cloud Consoleで確認できます。

確認方法
  1. Google Cloud Consoleにログインし、プロジェクトを選択します。
  2. 左側のメニューから「APIとサービス」→「ダッシュボード」に移動します。
  3. 「ダッシュボード」では、プロジェクト内で使用しているAPIの一覧とその使用状況が表示されます。
  4. ここで、YouTube Data APIを選択すると、そのAPIの使用状況(リクエスト数やクォータ消費量など)を確認できます。


上限に達した場合

1日の上限に達した場合は翌日に再実行することでデータを取得できます。

まとめ


今回の方法を使うことで、自分のチャンネルだけでなく、お気に入りのチャンネルの動画データも簡単にスプレッドシートにまとめることができます。

視聴回数やいいね数、動画の長さといった詳細な情報も取得できるため、分析や管理が非常に効率的になります。

弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。

GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。

また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。

貴方の業務改善を全力でサポートいたします。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次