使用YouTube API获取视频统计数据时遇Google Sheets脚本报错求助
YouTube API 写入Google Sheets统计数据报错修复方案
问题重现
运行脚本时触发错误:
Exception: The number of rows in the range must be at least 1.
移除最后一行写入统计数据的代码后,脚本可正常写入搜索结果(标题、频道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]) 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) }
错误原因
- 视频ID提取逻辑完全错误:原代码中
results.map((id) => id[0])取的是视频标题而非视频ID,YouTube API无法通过标题返回统计数据,导致stats.items为空数组,videoStats也为空,调用setValues时因行数为0触发报错。 - 写入范围冲突:原代码从第3列开始写入统计数据,会覆盖之前写入的发布时间(第三列),逻辑混乱。
- 未过滤非视频结果:Search API可能返回频道、播放列表等非视频内容,这些内容没有
videoId,会导致ID列表无效。
修复方案
核心修正点
- 从Search结果中正确提取
item.id.videoId作为视频ID - 指定Search API只返回视频类型内容
- 调整统计数据的写入起始列,避免覆盖原有数据
- 处理统计字段缺失的情况(如隐藏点赞数的视频)
- 增加空结果判断,提前终止避免报错
修复后完整代码
function YoutubeScraper() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); // 仅搜索视频类型内容,避免混入频道/播放列表 var search = YouTube.Search.list("snippet, id", { q: "searching youtube", maxResults: 30, type: "video" }); var results = []; var videoIds = []; // 遍历搜索结果,提取有效数据和视频ID search.items.forEach(item => { if (item.id.kind === "youtube#video") { results.push([ item.snippet.title, item.snippet.channelId, item.snippet.publishedAt ]); videoIds.push(item.id.videoId); } }); // 无有效视频时提示并终止 if (videoIds.length === 0) { SpreadsheetApp.getUi().alert("未找到符合条件的视频"); return; } // 请求视频统计数据 var stats = YouTube.Videos.list("statistics", { id: videoIds.join(",") }); // 提取统计数据,处理可能缺失的字段 var videoStats = stats.items.map(item => [ item.statistics.viewCount || 0, item.statistics.likeCount || 0, item.statistics.commentCount || 0 ]); // 写入基础信息(第2行第1列开始) sheet.getRange(2, 1, results.length, results[0].length).setValues(results); // 写入统计数据(第2行第4列开始,不覆盖发布时间) sheet.getRange(2, 4, videoStats.length, videoStats[0].length).setValues(videoStats); }
内容的提问来源于stack exchange,提问作者Danilo Reuben
相关产品推荐
相关产品推荐

