はじめに
GASでYouTube APIを使用し、自分のチャンネルで投稿しているすべての動画に対して特定の期間の動画情報を取得しスプレッドシートに出力する。
この記事ではYouTube Data APIについて解説していきます。
YouTube Analytics APIの解説や、トラフィックソースの取得、ショート動画かどうかの判別は以下の記事をご覧ください。
目的

YouTubeチャンネルに含まれる動画に関する情報を取得し、スプレッドシートで管理したい。
本記事では以下の項目を取得します。
- 動画ID
- 動画タイトル
- 投稿日
- 再生回数
- 高評価の数
- コメントの数
- 動画URL
取得できるプロパティの詳細は以下のリファレンスをご覧ください。
コーディング
まずは実際のコードをご覧ください。
エラー処理等は割愛しています。
以下の項目で分解して解説していきます。
/**
* チャンネルが投稿したすべての動画から必要な情報をスプシに出力
*/
function getAndOutputChannelInfo() {
// チャンネルが投稿した動画のプレイリストIDを取得
const channel = YouTube.Channels.list(
'contentDetails', {
mine: true
});
const {contentDetails} = channel.items[0];
// プレイリストID
const playListId = contentDetails.relatedPlaylists.uploads;
// チャンネル内のすべての動画のIDを取得する
const videoIds = getVideoIds(playListId);
// 動画の情報を取得し必要なデータを抽出
const outputVideosData = createOutputData(videoIds);
// スプシに出力
const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
const videoSheet = spreadSheet.getSheetByName('動画');
exportSpreadsheet(videoSheet, outputVideosData);
}
/**
* チャンネル内のすべての動画のIDを取得する
*/
function getVideoIds(id, pageToken) {
const playlistItemsInfo = YouTube.PlaylistItems.list([
'contentDetails'
], {
'playlistId': id,
'maxResults': 50,
pageToken,
});
let videoIds = playlistItemsInfo.items.map(item => item.contentDetails.videoId);
const nextPageToken = playlistItemsInfo.nextPageToken;
if (nextPageToken) {
videoIds = [...videoIds, ...getVideoIds(id, nextPageToken)];
}
return videoIds;
}
/**
* 動画情報を取得する
*/
function getVideos(ids) {
let videos = [];
for(let i = 0, l = ids.length; i < l; i++) {
const videoInfo = YouTube.Videos.list([
'snippet',
'statistics',
], {
'id': ids[i].join(','),
});
videos = [...videos, ...videoInfo.items];
}
return videos;
}
/**
* 第1引数のarrayを第2引数指定したnumberで区切って返す
*/
function sliceByNumber(array, number) {
const length = Math.ceil(array.length / number);
return new Array(length).fill().map((_, i) =>
array.slice(i * number, (i + 1) * number)
)
}
/**
* スプシ出力用のデータを作成
*/
function createOutputData(ids) {
// 詳細データを取得
const videos = getVideos(sliceByNumber(ids, 50));
// 詳細データを追加
const videoInfos = [];
videos.map((item) => {
videoInfos.push([
item.id, // 動画ID
item.snippet.title, // 動画タイトル
Utilities.formatDate(new Date(item.snippet.publishedAt), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm'), // 投稿日
item.statistics.viewCount || 0, // 再生回数
item.statistics.likeCount || 0, // 高評価の数
item.statistics.commentCount || 0, // コメントの数
`https://www.youtube.com/watch?v=${item.id}` // 動画URL
])
});
return videoInfos;
}
/**
* スプシに出力
*/
function exportSpreadsheet(sheet, outputData) {
sheet.getRange(1, 1, 1, 7).setValues([['動画id', 'タイトル', '投稿日', '再生回数', '高評価', 'コメント', '動画URL']]);
sheet.getRange(2, 1, outputData.length, 7).setValues(outputData);
}
1.プレイリストIDの取得
プレイリストIDを取得したいのでpartにcontentDetailsを設定しています。
詳細は以下のリファレンスをご覧ください。
GASとYouTubeのGoogleアカウントが同じ場合はmine: trueを設定すればOK。
// チャンネルが投稿した動画のプレイリストIDを取得
const channel = YouTube.Channels.list(
'contentDetails', {
mine: true
});
直接チャンネルIDを指定する場合は以下のように書きます。
const channel = YouTube.Channels.list(
'contentDetails', {
id: 'XXXXXXXXXXXXXXXXXXXXXX' // 自分のチャンネルID
});
2.チャンネル内のすべての動画のIDを取得
動画IDを取得したいのでpartにcontentDetailsを設定しています。
PlaylistItems.listでは最大200件の動画情報しか取得することができません。
それ以上データがある場合は、APIのレスポンス内でnextPageTokenが返答されます。
nextPageTokenがある場合は、繰り返し取得することで、チャンネルが投稿したすべての動画を取得することができます。
function getVideoIds(id, pageToken) {
const playlistItemsInfo = YouTube.PlaylistItems.list([
'contentDetails'
], {
'playlistId': id,
'maxResults': 50,
pageToken,
});
let videoIds = playlistItemsInfo.items.map(item => item.contentDetails.videoId);
const nextPageToken = playlistItemsInfo.nextPageToken;
if (nextPageToken) {
videoIds = [...videoIds, ...getVideoIds(id, nextPageToken)];
}
return videoIds;
}
詳細は以下のリファレンスをご覧ください。
3.動画情報を取得
取得項目の内容からpartにはsnippetとstatisticsを設定しています。
function getVideos(ids) {
let videos = [];
for(let i = 0, l = ids.length; i < l; i++) {
const videoInfo = YouTube.Videos.list([
'snippet',
'statistics',
], {
'id': ids[i].join(','),
});
videos = [...videos, ...videoInfo.items];
}
return videos;
}
詳細は以下のリファレンスをご覧ください。
4.スプシ出力用のデータを作成
スプシに出力したい項目を取得しています。
function createOutputData(ids) {
// 詳細データを取得
const videos = getVideos(sliceByNumber(ids, 50));
const videoInfos = [];
videos.map((item) => {
videoInfos.push([
item.id, // 動画ID
item.snippet.title, // 動画タイトル
Utilities.formatDate(new Date(item.snippet.publishedAt), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm'), // 投稿日
item.statistics.viewCount || 0, // 再生回数
item.statistics.likeCount || 0, // 高評価の数
item.statistics.commentCount || 0, // コメントの数
`https://www.youtube.com/watch?v=${item.id}` // 動画URL
])
});
return videoInfos;
}
最後に
細かい解説は省いていますが、ソースに必要なコメントは残しているので、順を追って理解することができるかと思います。
GASとYouTube APIどちらも初めて触りましたが、基本的にリファレンスを読めばある程度のことは分かるので助かりました。
誰かのお役に立てると幸いです。