YouTubeチャンネルの動画情報を分析したい場合、手作業でデータを収集するのは大変な作業です。しかし、YouTube Data APIを活用することで、効率的に情報を取得し、スプレッドシートに保存することができます。
Google ColaboratoryやローカルのPythonを使う方法もありますが、これらの環境では追加のライブラリのインストールや認証情報の設定が必要になる場合があり、少し複雑です(もちろん、より柔軟にカスタマイズできるというメリットもあります)。
一方で、Google Apps Script(以下GAS)を使うと、初心者でも比較的簡単に情報を取得できます。この記事では、GASを使って、初心者でも簡単にYouTubeチャンネルの動画情報を取得する方法をご紹介します。
YouTube Data APIで取得できる情報
YouTube Data APIを使うと、以下のような動画情報を取得できます。
- タイトル
- 動画の説明欄(冒頭のみ)
- サムネイル画像URL
- 動画URL
- 動画の時間
- 視聴回数
- 高評価数
- コメント数
これらの情報をスプレッドシートにまとめることで、自分のチャンネルの分析や、競合チャンネルのリサーチに役立てることができます。
手順
1. スプレッドシートの準備
まず、データを保存したいスプレッドシートを新規作成または既存のものを開きます。
シート名「設定」を作成し、A列にチャンネル名、 B列にチャンネルIDを貼り付けます。
新しいシートを作成し、シート名をチャンネル名と同じにします。
一番上の行(A列からO列)は「チャンネル名、タイトル動画の説明欄、サムネイル画像、サムネイル画像URL、動画URL、投稿日、視聴回数、高評価数、コメント数、エンゲージメント数、動画時間、高評価率、コメント率、エンゲージメント率」です。
2. GASを開く
スプレッドシートを開いた状態で、「拡張機能」>「Apps Script」をクリックし、GASエディタを開きます。
3. コードを入力
GASエディタに以下のコードを貼り付けます。
function getPopularVideos() {
var settingsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("設定");
var settingsData = settingsSheet.getDataRange().getValues();
for (var i = 1; i < settingsData.length; i++) {
var channelName = settingsData[i][0];
var channelId = settingsData[i][1];
// チャンネル名と同じ名前のシートを取得または作成
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(channelName);
if (!sheet) {
sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(channelName);
}
// YouTube Data APIを使ってチャンネルの人気動画を検索
var searchResponse = YouTube.Search.list('id,snippet', {
channelId: channelId,
order: 'viewCount',
type: 'video',
maxResults: 25
});
var videos = [];
for (var j = 0; j < searchResponse.items.length; j++) {
var item = searchResponse.items[j];
var videoId = item.id.videoId;
var videoResponse = YouTube.Videos.list('statistics,contentDetails', {
id: videoId
});
// 動画の詳細データを取得
var videoDetails = videoResponse.items[0];
var statistics = videoDetails.statistics;
var contentDetails = videoDetails.contentDetails;
// 投稿日のフォーマット変更
var date = new Date(item.snippet.publishedAt);
var publishedAt = date.getFullYear() + "/" + ('0' + (date.getMonth() + 1)).slice(-2) + "/" + ('0' + date.getDate()).slice(-2);
// 動画時間のフォーマット変更
var duration = convertISO8601DurationToHHMMSS(contentDetails.duration);
// エンゲージメント数の計算(高評価数とコメント数の合算)
var engagementNumber = parseInt(statistics.likeCount, 10) + parseInt(statistics.commentCount, 10);
// 高評価率、コメント率、エンゲージメント率を計算(パーセンテージ化して四捨五入)
var commentRate = ((statistics.commentCount / statistics.viewCount) * 100).toFixed(2) + "%";
var likeRate = ((statistics.likeCount / statistics.viewCount) * 100).toFixed(2) + "%";
var engagementRate = ((engagementNumber / statistics.viewCount) * 100).toFixed(2) + "%";
videos.push([
item.snippet.channelTitle, // チャンネル名
item.snippet.title, // タイトル
item.snippet.description, // 動画の説明欄をC列に追加
'=IMAGE("' + item.snippet.thumbnails.high.url + '")', // サムネイル画像
item.snippet.thumbnails.high.url, // サムネイルのURL
"https://www.youtube.com/watch?v=" + videoId, // 動画のURL
publishedAt, // 投稿日
statistics.viewCount.toString(), // 視聴回数
statistics.likeCount.toString(), // 高評価数
statistics.commentCount.toString(), // コメント数
engagementNumber.toString(), // エンゲージメント数
duration, // 動画時間
likeRate, // 高評価率
commentRate, // コメント率
engagementRate // エンゲージメント率
]);
}
// スプレッドシートにデータを書き込み
sheet.getRange(2, 1, videos.length, 15).setValues(videos);
}
}
function setPercentageFormat(sheet, numRows) {
// 高評価率、コメント率、エンゲージメント率の列にパーセンテージ形式を適用
var likeRateRange = sheet.getRange(2, 12, numRows, 1); // 高評価率が入る列
var commentRateRange = sheet.getRange(2, 13, numRows, 1); // コメント率が入る列
var engagementRateRange = sheet.getRange(2, 15, numRows, 1); // エンゲージメント率が入る列(訂正:正しい列番号は14)
// 書式をパーセンテージに設定
likeRateRange.setNumberFormat("0.00%");
commentRateRange.setNumberFormat("0.00%");
engagementRateRange.setNumberFormat("0.00%");
}
function convertISO8601DurationToHHMMSS(duration) {
// duration が undefined または null の場合、デフォルト値を返す
if (!duration) {
return "00:00:00";
}
var match = duration.match(/PT(\d+H)?(\d+M)?(\d+S)?/);
if (!match) {
// duration が期待した形式でない場合、デフォルト値を返す
return "00:00:00";
}
var hours = parseInt(match[1] || 0);
var minutes = parseInt(match[2] || 0);
var seconds = parseInt(match[3] || 0);
// 時間、分、秒を2桁表示に修正
var formattedHours = ('0' + hours).slice(-2);
var formattedMinutes = ('0' + minutes).slice(-2);
var formattedSeconds = ('0' + seconds).slice(-2);
return formattedHours + ":" + formattedMinutes + ":" + formattedSeconds;
}
4. 実行
コードを保存し、「実行」ボタンをクリックします。初回実行時は、アクセス権限の承認が必要です。
結果の確認
実行が完了すると、指定したスプレッドシートのシートにデータが保存されています。A列から順番に「チャンネル名、タイトル動画の説明欄、サムネイル画像、サムネイル画像URL、動画URL、投稿日、視聴回数、高評価数、コメント数、エンゲージメント数、動画時間、高評価率、コメント率、エンゲージメント率」が取得できているはずです。
以上が、GASを使ってYouTubeチャンネルの動画情報をスプレッドシートに保存する方法です。
上の方法では「再生順」に並んでいますが、orderの箇所を「date」に変更すると、直近の投稿日順に取得することができます。
// YouTube Data APIを使ってチャンネルの最新の動画を検索
var searchResponse = YouTube.Search.list('id,snippet', {
channelId: channelId,
order: 'date', // ここを 'date' に変更
type: 'video',
maxResults: 25
});
カスタマイズすれば、もっと使いやすい形にできます。ぜひ活用してみてください。