修改点:
- 我认为在您的情况下,为了检索
subscriberCount 的值,将使用“频道:列表”的方法,如YouTube.Channels.list。另外,您提供的官方文档网址是“频道:列表”的方法。
- 但在您的脚本中,使用了
YouTube.Videos.list。我认为这可能是您的问题的原因。
- 在您的脚本中,我认为您想将
subscriberCount 的值放在频道ID 的同一行。但是,在您当前的脚本中,results 有 4 列。但是videoStats 来自“C”列。在这种情况下,“C”和“D”列会被覆盖。
当以上几点反映到你的脚本中时,它变成如下。
修改后的脚本:
function YoutubeScraper() {
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet()
var activeSheet = spreadSheet.getActiveSheet();
var search = YouTube.Search.list("snippet", { q: "pizza", maxResults: 50 });
var results = search.items.map((item) => [item.snippet.channelId, item.snippet.title, item.snippet.publishedAt, item.snippet.thumbnails.default.url]);
var ids = results.map((id) => id[0]).join(",");
var stats = YouTube.Channels.list("statistics", { id: ids });
var videoStats = stats.items.map((item) => [item.id, item.statistics.viewCount, item.statistics.subscriberCount]).reduce((o, [id, ...v]) => Object.assign(o, {[id]: v}));
results = results.map(e => videoStats[e[0]] ? e.concat(videoStats[e[0]]) : e.concat(Array(2).fill("")));
activeSheet.getRange(2, 1, results.length, results[0].length).setValues(results);
}
- 在此修改中,
videoStats 的值被转换为用于搜索频道 ID 的对象。并且,使用该对象,每个值都被推送到results 的相应行。然后,将这些值放入活动工作表中。
-
YouTube.Channels.list 没有 item.statistics.likeCount, item.statistics.dislikeCount 的属性。
参考:
补充:
根据您的以下回复,
该问题尚未完全解决。我要做的是从 YouTube.Seach 中获取所有我能获取的信息:channelId、videoId、视频标题、发布时间和缩略图。来自 YouTube.Videos:喜欢、不喜欢的观看次数和 cmets 的数量。 From YouTube.Channels:频道总观看次数和订阅人数
下面修改后的脚本怎么样?
修改后的脚本:
function YoutubeScraper2() {
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet()
var activeSheet = spreadSheet.getActiveSheet();
// Retrieve YouTube.Search.list.
var search = YouTube.Search.list("snippet", { q: "pizza", maxResults: 50 });
var results = search.items.map((item) => [item.snippet.channelId, item.id.videoId, item.snippet.title, item.snippet.publishedAt, item.snippet.thumbnails.default.url]);
// Retrieve channel IDs and video IDs.
var {channelIds, videoIds} = results.reduce((o, [channelId, videoId]) => {
o.channelIds.push(channelId);
o.videoIds.push(videoId);
return o;
}, {channelIds: [], videoIds: []});
// Retrieve YouTube.Videos.list.
var videoList = YouTube.Videos.list("statistics", {id: videoIds.join(",")});
var videoStats = videoList.items.map((item) => [item.id, item.statistics.viewCount, item.statistics.likeCount, item.statistics.dislikeCount]).reduce((o, [id, ...v]) => Object.assign(o, {[id]: v}), {});
// Retrieve YouTube.Channels.list
var channelList = YouTube.Channels.list("statistics", { id: channelIds.join(",") });
var channelStats = channelList.items.map((item) => [item.id, item.statistics.viewCount, item.statistics.subscriberCount]).reduce((o, [id, ...v]) => Object.assign(o, {[id]: v}), {});
// Create an array for putting values and put the values to Spreadsheet.
results = results.map(e => channelStats[e[0]] ? e.concat(channelStats[e[0]]) : e.concat(Array(2).fill("")));
results = results.map(e => videoStats[e[1]] ? e.concat(videoStats[e[1]]) : e.concat(Array(3).fill("")));
var header = ["channelId", "videoId", "title", "publishedAt", "thumbnails", "viewCount", "subscriberCount", "viewCount", "likeCount", "dislikeCount"];
results.unshift(header);
activeSheet.getRange(1, 1, results.length, results[0].length).setValues(results);
}
- 运行上述脚本时,
channelId, videoId, title, publishedAt, thumbnails, viewCount, subscriberCount, viewCount, likeCount, dislikeCount 列将被放入活动工作表中。
- 如果不想放表头,请将最后3行修改为
activeSheet.getRange(2, 1, results.length, results[0].length).setValues(results);。
- 如果要排列列,请修改上面的脚本。
结果:
当上面的脚本运行时,得到以下电子表格。