我可以使用 YouTube API 获取视频统计信息吗?

问题描述 投票:0回答:1

当我尝试获取统计信息时出现此错误:

'例外:范围内的行数必须至少为 1。'

没有最后一行,运行良好。

这是代码:

function YoutubeScraper() {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getActiveSheet()

  var search = YouTube.Search.list ("snippet, id", {q: "searching youtube", maxResults: 30})

  var results = search.items.map((item) => [item.snippet.title, item.snippet.channelId, item.snippet.publishedAt])

  var ids = results.map ((id) => id[0]).join(",")

  var stats = YouTube.Videos.list ("statistics", {id: ids})

  var videoStats = stats.items.map((item) => [item.statistics.viewCount, item.statistics.likeCount, item.statistics.commentCount])
  
  sheet.getRange(2,1, results.length, results[0].length).setValues(results)
  sheet.getRange(2,3, videoStats.length, results[0].length).setValues(videoStats)
}

我希望在我的活动工作表上获得一个包含查询结果及其统计信息的列表。可以得到结果,但不能得到统计数据。我尝试过更改统计数据的范围,但不起作用。没有最后一行运行良好,我在 Google 文档上的活动工作表已填充结果(标题、频道 ID 和发布时间),但无法使最后一行正常工作。

web-scraping youtube google-docs
1个回答
0
投票

修改要点:

  • 我认为在你的脚本中,
    var ids = results.map ((id) => id[0]).join(",")
    的值是
    item.snippet.title
    results
    。这样,
    stats.items
    就是
    []
    。我猜这就是你当前问题
    Exception: The number of rows in the range must be at least 1.
    的原因。
  • 在这种情况下,需要使用视频ID来
    YouTube.Videos.list
  • 另外,在您的情况下,我认为可以使用通道 ID 通过一次调用将这些值放入单元格中。

当这些要点反映在你的脚本中时,就会变成如下所示。

修改后的脚本:

function YoutubeScraper() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var search = YouTube.Search.list("snippet, id", { q: "searching youtube", maxResults: 30 });
  var results = search.items.map((item) => [item.snippet.title, item.snippet.channelId, item.snippet.publishedAt]);

  // --- I modified the below script.
  if (search.items.length == 0) return;
  var ids = search.items.map(({ id: { videoId } }) => videoId || "").filter(String);
  var stats = YouTube.Videos.list(["statistics", "snippet"], { id: ids });
  var obj = stats.items.reduce((o, { snippet, statistics }) => (o[snippet.channelId] = [statistics.viewCount || 0, statistics.likeCount || 0, statistics.commentCount || 0], o), {});
  var values = results.map(e => [...e, ...(obj[e[1]] ? obj[e[1]] : Array(3).fill(null))]);
  sheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}
  • 运行此脚本时,这些值将被放入活动工作表的单元格中。

参考:

© www.soinside.com 2019 - 2024. All rights reserved.