需要使用 YouTube 数据 API v3 将频道的视频填充到 Google 表格中
Need to populate a channel's videos onto Google Sheets using YouTube Data API v3
我对所有这些感到不知所措,因为我对使用 API 是全新的。我想用一个频道的视频填充 Google Sheet,这样我就可以随时更新它的统计数据,同时向列表添加(或替换最旧的)新视频。我尝试按照视频指南进行操作,感觉很接近,但我遇到了麻烦。
注意:我在下面使用的播放列表 ID 用于 Google 开发者频道。
我观看的视频显示了一个示例,其中被拉取的视频是特定关键字的热门搜索结果。相反,我想从特定频道中提取最后 50 个视频。
原始代码有一行:
var sr = YouTube.Search.list("snippet,id", { q: "guitars", maxResults: 50});
我将其更改为:
var sr = YouTube.PlaylistItems.list("snippet,id", { playlistId: "UU_x5XG1OV2P6uZZ5FSM9Ttw", maxResults: 50});
问题似乎出在这一行:
var srVidsOnly = sr.items.filter(function(res){ return res.resourceId.kind === "youtube#playlistItems"});
我试过this,经过多次试错后,放弃了。我完全不确定这条线应该是什么样子。
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
var sr = YouTube.PlaylistItems.list("snippet,id", { playlistId: "UU_x5XG1OV2P6uZZ5FSM9Ttw", maxResults: 50});
var srVidsOnly = sr.items.filter(function(res){ return res.resourceId.kind === "youtube#playlistItems"});
var modRes = srVidsOnly.map(function(v){ return [v.resourceId.videoId,v.snippet.title]; });
var ids = modRes.map(function(res){return res[0]; }).join(",");
var stats = YouTube.Videos.list("statistics", {id: ids});
var vidStats = stats.items.map(function(res){return [res.statistics.viewCount, res.statistics.likeCount]; });
activeSheet.getRange(2, 1, modRes.length, modRes[0].length).setValues(modRes);
activeSheet.getRange(2, 3, vidStats.length, vidStats[0].length).setValues(vidStats);
}
给出的错误是:
TypeError: Cannot read property "kind" from undefined. (line 6, file "Code")
从第五行删除种类,如下所示:
var srVidsOnly = sr.items.filter(function(res){ return res.resourceId === "youtube#playlistItems"});
报错:
TypeError: Cannot read property "length" from undefined. (line 12, file "Code")
按照最初的视频指南完全有效(搜索结果中的视频)。 sheet 的格式正是我想要的。我只需要来自特定频道的视频而不是搜索结果。
谢谢
这个修改怎么样?
修改点:
- 请修改如下。
res.resourceId.kind
到 res.kind
youtube#playlistItems
到 youtube#playlistItem
v.resourceId.videoId
到 v.snippet.resourceId.videoId
.
所以当上面的修改反映到你的脚本中,就变成了下面这样。
修改后的脚本:
请按如下方式修改脚本中的myFunction()
。
从:
var srVidsOnly = sr.items.filter(function(res){ return res.resourceId.kind === "youtube#playlistItems"});
var modRes = srVidsOnly.map(function(v){ return [v.resourceId.videoId,v.snippet.title]; });
到:
var srVidsOnly = sr.items.filter(function(res){ return res.kind === "youtube#playlistItem"});
var modRes = srVidsOnly.map(function(v){ return [v.snippet.resourceId.videoId,v.snippet.title]});
注:
- 根据您的脚本,我了解到您正在使用 Google Apps 脚本和高级 Google 服务。
参考文献:
如果我误解了你的问题,这不是你想要的结果,我深表歉意。
我对所有这些感到不知所措,因为我对使用 API 是全新的。我想用一个频道的视频填充 Google Sheet,这样我就可以随时更新它的统计数据,同时向列表添加(或替换最旧的)新视频。我尝试按照视频指南进行操作,感觉很接近,但我遇到了麻烦。
注意:我在下面使用的播放列表 ID 用于 Google 开发者频道。
我观看的视频显示了一个示例,其中被拉取的视频是特定关键字的热门搜索结果。相反,我想从特定频道中提取最后 50 个视频。
原始代码有一行:
var sr = YouTube.Search.list("snippet,id", { q: "guitars", maxResults: 50});
我将其更改为:
var sr = YouTube.PlaylistItems.list("snippet,id", { playlistId: "UU_x5XG1OV2P6uZZ5FSM9Ttw", maxResults: 50});
问题似乎出在这一行:
var srVidsOnly = sr.items.filter(function(res){ return res.resourceId.kind === "youtube#playlistItems"});
我试过this,经过多次试错后,放弃了。我完全不确定这条线应该是什么样子。
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
var sr = YouTube.PlaylistItems.list("snippet,id", { playlistId: "UU_x5XG1OV2P6uZZ5FSM9Ttw", maxResults: 50});
var srVidsOnly = sr.items.filter(function(res){ return res.resourceId.kind === "youtube#playlistItems"});
var modRes = srVidsOnly.map(function(v){ return [v.resourceId.videoId,v.snippet.title]; });
var ids = modRes.map(function(res){return res[0]; }).join(",");
var stats = YouTube.Videos.list("statistics", {id: ids});
var vidStats = stats.items.map(function(res){return [res.statistics.viewCount, res.statistics.likeCount]; });
activeSheet.getRange(2, 1, modRes.length, modRes[0].length).setValues(modRes);
activeSheet.getRange(2, 3, vidStats.length, vidStats[0].length).setValues(vidStats);
}
给出的错误是:
TypeError: Cannot read property "kind" from undefined. (line 6, file "Code")
从第五行删除种类,如下所示:
var srVidsOnly = sr.items.filter(function(res){ return res.resourceId === "youtube#playlistItems"});
报错:
TypeError: Cannot read property "length" from undefined. (line 12, file "Code")
按照最初的视频指南完全有效(搜索结果中的视频)。 sheet 的格式正是我想要的。我只需要来自特定频道的视频而不是搜索结果。
谢谢
这个修改怎么样?
修改点:
- 请修改如下。
res.resourceId.kind
到res.kind
youtube#playlistItems
到youtube#playlistItem
v.resourceId.videoId
到v.snippet.resourceId.videoId
.
所以当上面的修改反映到你的脚本中,就变成了下面这样。
修改后的脚本:
请按如下方式修改脚本中的myFunction()
。
var srVidsOnly = sr.items.filter(function(res){ return res.resourceId.kind === "youtube#playlistItems"});
var modRes = srVidsOnly.map(function(v){ return [v.resourceId.videoId,v.snippet.title]; });
到:
var srVidsOnly = sr.items.filter(function(res){ return res.kind === "youtube#playlistItem"});
var modRes = srVidsOnly.map(function(v){ return [v.snippet.resourceId.videoId,v.snippet.title]});
注:
- 根据您的脚本,我了解到您正在使用 Google Apps 脚本和高级 Google 服务。
参考文献:
如果我误解了你的问题,这不是你想要的结果,我深表歉意。