Google apps script 需要填充通道';使用YouTube数据API v3将视频下载到Google工作表

Google apps script 需要填充通道';使用YouTube数据API v3将视频下载到Google工作表,google-apps-script,google-sheets,youtube-api,youtube-data-api,Google Apps Script,Google Sheets,Youtube Api,Youtube Data Api,我对所有这些都感到不知所措,因为我对使用API是完全陌生的。我想用一个频道的视频填充一个谷歌表,这样我就可以随时更新它的统计数据,同时向列表中添加(或替换最旧的)新视频。我试着跟随一个视频指南,感觉我很接近,但我遇到了麻烦 注意:我下面使用的playliID是针对Google开发者频道的 我观看的视频显示了一个示例,其中所提取的视频是特定关键字的顶级搜索结果。相反,我想从一个特定的频道中提取最后50个视频 最初的代码有这样一行: var sr = YouTube.Search.list("sni

我对所有这些都感到不知所措,因为我对使用API是完全陌生的。我想用一个频道的视频填充一个谷歌表,这样我就可以随时更新它的统计数据,同时向列表中添加(或替换最旧的)新视频。我试着跟随一个视频指南,感觉我很接近,但我遇到了麻烦

注意:我下面使用的playliID是针对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"});
我试过了,经过多次尝试,我放弃了。我根本不知道这条线应该是什么样子

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")
从第五行删除kind,如下所示:

var srVidsOnly = sr.items.filter(function(res){ return res.resourceId === "youtube#playlistItems"});
给出了错误:

TypeError: Cannot read property "length" from undefined. (line 12, file "Code")
按照最初的视频指南进行操作(搜索结果中的视频)。这张纸的格式正是我想要的。我只需要特定频道的视频,而不是搜索结果


谢谢

这次修改怎么样

修改点:
  • 请修改如下。
    • res.resourceId.kind
      to
      res.kind
    • youtube#playlitems
      youtube#playlitem
    • v.resourceId.videoId
      v.snippet.resourceId.videoId
因此,当上述修改反映到脚本中时,它将变成如下所示

修改脚本: 请在脚本中修改
myFunction()
,如下所示

发件人: 致: 注:
  • 从您的脚本中,我了解到您正在使用谷歌应用程序脚本和高级谷歌服务
参考资料:

如果我误解了你的问题,而这不是你想要的结果,我道歉。

这个修改怎么样

修改点:
  • 请修改如下。
    • res.resourceId.kind
      to
      res.kind
    • youtube#playlitems
      youtube#playlitem
    • v.resourceId.videoId
      v.snippet.resourceId.videoId
因此,当上述修改反映到脚本中时,它将变成如下所示

修改脚本: 请在脚本中修改
myFunction()
,如下所示

发件人: 致: 注:
  • 从您的脚本中,我了解到您正在使用谷歌应用程序脚本和高级谷歌服务
参考资料:

如果我误解了您的问题,并且这不是您想要的结果,我很抱歉。

请扩展您的代码片段,以查看该
srVidsOnly
的使用位置。谢谢您,我在其中犯了一个错误。我编辑了我的帖子以反映这些更改。请扩展您的代码片段,以查看该
srVidsOnly
的使用位置。谢谢您,我在其中出错了。我编辑了我的帖子以反映这些变化。
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]});