YouTube APIを使って動画情報をスプレッドシートにまとめる方法:GASで自動化!
今回は、前回の記事で設定したAPIキーを使い、GASを活用してYouTubeに動画情報をスプレッドシートにまとめる方法をご紹介します。
YouTube APIを使うことで、自分のチャンネルの分析や、お気に入りのチャンネルの動画情報をスプレッドシートに簡単にまとめることができます。
手作業での入力が不要となり、動画タイトル、公開日、チャンネルタイトル、動画URLなどのデータを効率的に取得可能です。
完成イメージ
指定したチャンネルID・動画本数をもとに、スプレッドシートに一覧表示
各動画の基本情報がスプレッドシートに一覧表示され、視覚的にわかりやすく整理できます。
YouTube APIキーの準備
YouTube Data API v3のAPIキーを取得し、スクリプトプロパティに設定します。
スクリプトプロパティ名 例:「YOUTUBE_DATA_API_KEY」
(こちらの記事を参照)
手順
B1セルにYouTubeチャンネルIDを入力します。
B2セルには取得する開始位置、B3セルには取得終了位置を記入します。
例えば、1〜10と設定すると最新動画から10件を取得します。
5行目にはヘッダーとして、以下項目を入力します。
項目の入力(例)
入力内容 | |
---|---|
A5 | 動画ID |
B5 | タイトル |
C5 | 公開日 |
D5 | サムネイル画像 |
E5 | チャンネルタイトル |
F5 | 視聴回数 |
G5 | いいね数 |
H5 | 動画の長さ |
I5 | 動画URL |
Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックして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」形式に変換する関数を用意しています。
- この関数で取得した動画の再生時間を見やすい形式に変換し、スプレッドシートに書き込みます。
スクリプトを書いたら、名前をつけて保存します。
(例:「YouTubeデータ取得」)
スクリプトを実行すると、YouTubeデータを取得します。
初めてそのスクリプトを実行する場合は権限の確認が必要です。
そのため、『権限を確認』を押します。
許可の詳細手順
「詳細」をクリックします。
「無題のプロジェクト(安全ではないページ)に移動」をクリックします。
「許可」をクリックします。
スプレッドシートには、指定した本数の動画が新しい順に一覧表示されます。
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で確認できます。
確認方法
- Google Cloud Consoleにログインし、プロジェクトを選択します。
- 左側のメニューから「APIとサービス」→「ダッシュボード」に移動します。
- 「ダッシュボード」では、プロジェクト内で使用しているAPIの一覧とその使用状況が表示されます。
- ここで、YouTube Data APIを選択すると、そのAPIの使用状況(リクエスト数やクォータ消費量など)を確認できます。
- 上限に達した場合
-
1日の上限に達した場合は翌日に再実行することでデータを取得できます。
まとめ
今回の方法を使うことで、自分のチャンネルだけでなく、お気に入りのチャンネルの動画データも簡単にスプレッドシートにまとめることができます。
視聴回数やいいね数、動画の長さといった詳細な情報も取得できるため、分析や管理が非常に効率的になります。
弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。
GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。
また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。
貴方の業務改善を全力でサポートいたします。
コメント