Webサイトから情報を取得する⑤ Web API vol.2
Web API vol.1では、YouTube Data APIのSearchリソースを使って、検索ワードからヒットした動画のIDとタイトルを取得してみました。
GASのApps Scriptに標準装備されているサービスを使えば、APIの導入がとても簡単であることも分かりました。
せっかくAPIの世界に少し触れることができたので、もう少しAPIの世界を探検してみたいと思います。
vol.1では、動画のIDとタイトル、それからIDにちょっと手を加えてURLリンクを取得できました。
でも、もう少し動画の情報が欲しい気がします。例えば、動画の再生回数とか、高評価数とか…
はい。それらの情報ももちろんAPIで取得できますよ!
それらを取得するには、YouTube Data APIのVideosリソースを使います。
これには、先に取得した動画IDも不可欠ですので、vol.1の応用編とも言えます。
では、やっていきましょう!
Videosリソースの目的のプロパティと階層を確認する
まず初めにやるべきことは、目的とするプロパティが何プロパティなのか、プロパティ名を確認することでしたね。
それが書いてあるのが公式ドキュメントですのて、早速見ていきましょう。
再生回数はstatisticsオブジェクトのviewCountプロパティ、高評価数は同じくstatisticsオブジェクトのlikeCountプロパティであることが確認できました。
つまり、上位プロパティのstatisticsが必須引数のpartパラメータとなります。

APIリクエストの構成
listメソッドの公式ドキュメントでリクエスト⇔レスポンスの方法、構成を確認しましょう。
動画の再生回数と高評価数を取得するgetVideoInfos関数を作成
Web API vol.1で用意したスプレッドシート「YouTube Data API」からコンテナバインドのApps Scriptを立ち上げます。
そして、動画の再生回数と高評価数を取得するgetVideoInfos関数を作ります。
引数のidはvol.1で作ったsearchByKeyword関数から受け取るので、そのようにコードを書き換えていきます。

function getVideoInfos(id) {
// APIリクエスト
const results = YouTube.Videos.list('statistics', {
id: id
});
// レスポンスからviewCountとlikeCountを取得
const viewCount = results.items[0].statistics.viewCount;
const likeCount = results.items[0].statistics.likeCount;
return [viewCount, likeCount];
}
searchByKeyword関数の書き換え
オレンジ枠がvol.1からの変更部分です。
解説はコメントアウト部分を参考にしてください。
forEach文の中でgetVideoInfos関数をループさせて、25件の動画IDを順番に受け取り、その動画の再生回数と高評価数を取得して、元のデータに追加しています。

function searchByKeyword() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('検索');
const query = sheet.getRange('B3').getValue();
try {
const results = YouTube.Search.list('id,snippet', {
q: query,
maxResults: 25,
type: 'video',
});
if (results === null) {
console.log('Unable to search videos');
return;
}
const data = [];
results.items.forEach(item => {
const url = 'https://www.youtube.com/watch?v=';
const rowData = [item.id.videoId, url + item.id.videoId, item.snippet.title];
// rowDataからidを取得
const id = rowData[0];
// getVideoInfos関数の引数にidを渡してviewCountとlikeCountを取得
const [viewCount, likeCount] = getVideoInfos(id);
// rowDataにviewCountとlikeCountを追加
rowData.push(viewCount, likeCount);
data.push(rowData);
});
return [data, query];
} catch (err) {
// TODO (developer) - Handle exceptions from Youtube API
console.log('Failed with an error %s', err.message);
}
}
シートに見出しをつける youtubeDataToSS関数の書き換え
情報量が多くなったので、分かりやすいようにシートの1行目に見出しをつけます。
youtubeDataToSS関数のコードを図のように追加、変更します。

function youtubeDataToSS() {
const [data, query] = searchByKeyword();
const firstRowData = [['ID', 'URL', 'タイトル', '再生回数', 'いいね数']];
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName(query);
if (sheet === null) {
sheet = ss.insertSheet(query);
}
sheet.getRange(1, 1, 1, 5).setValues(firstRowData);
sheet.getRange(2, 1, data.length, data[0].length).setValues(data);
}
完成です!
テスト実行
では、検索ワードに入力して試してみましょう。
今回も「大谷翔平」です。
検索ボタンをクリックします。

うまくいったようです!
1行目に見出しが表示されました。
ID、URL、タイトル、そして再生回数と高評価数が取得できています!

SearchリソースとVideosリソース、複数のリソースを用い、連結させることで取得できる情報の幅が広がりました。
APIを使いこなせば、可能性がどんどん広がりそうですね!