判別したいチャンネル内の動画がそんなになければ、
1つずつリダイレクトチェック
youtube.com/shorts/***
でリダイレクトされる場合は通常動画
リダイレクトされない場合はshorts動画という判定もあるけど、
動画の数が多いと、リダイレクトチェックに時間がかかって、
GASだとタイムアウトが発生する問題があった。
なので、
海外フォーラムで調べてみると、
非公式の方法ながら、Shorts動画のプレイリストが
ほぼどのチャンネルも自動生成されていることがわかった。
そこで、
UU~~~から始まるプレイリストIDを
UUSH~~~に編集し、
プレイリスト内の動画IDの配列を取得し、
配列の差分を取得することで、
通常動画の動画ID配列を作り、
その配列で情報取得をすることで、
一気に再生数やいいね数を調べることができた。
以下スクリプト
function getVideoInfo() {
const s = SpreadsheetApp.getActiveSpreadsheet();
const ss = s.getSheetByName("getVideoInfo");
//D2には調べたいチャンネルの投稿動画プレイリストIDが入ってる
const listId = ss.getRange("D2").getValue();
const videoIds = getVideoIds(listId);
console.log(videoIds.length);
//E2にはスプレッドシートの関数でUUをUUSHに変更したIDが入ってる
const shortsPlaylistId = ss.getRange("E2").getValue();
const shortsIds = getVideoIds(shortsPlaylistId);
console.log(shortsIds.length);
const diffIds = videoIds.filter(x => !shortsIds.includes(x));
console.log(diffIds.length);
const videos = getVideos(sliceByNumber(diffIds, 50));
var outputArray = [];
for(var i=0;videos.length>i;i++){
var url = `https://www.youtube.com/watch?v=${videos[i].id}`;
var fDate = Utilities.formatDate(new Date(videos[i].snippet.publishedAt) , "JST" , "yyyy/MM/dd");
var title = videos[i].snippet.title;
var viewCount = videos[i].statistics.viewCount;
l(`[${i}]動画名: ${title}, 再生数: ${viewCount}`);//確認用
//動画データを配列へPUSH
outputArray.push([title, url, fDate, viewCount]);
}
var writeTargetRow = 5;//←書き込みを開始したい行
ss.getRange(writeTargetRow,2,ss.getLastRow(),4).clear();
ss.getRange(writeTargetRow,2,outputArray.length,4).setValues(outputArray);
}