使用Google Script调用YouTube.Videos.list获取超50条视频数据报错求助
解决YouTube API批量获取视频数据的参数错误与分页问题
你遇到的问题核心有两个:
- YouTube API的
id参数限制:Videos.list接口的id参数一次最多接受50个视频ID,你把1000+个ID拼接成一个字符串传入,直接触发了参数无效的报错。 - 分页逻辑错误:原代码里的
pageToken完全没用——分页是用来获取超过单页最大结果的数据,但你已经一次性传了所有ID,API根本无法分页返回,而且循环结束后只保留了最后一次请求的结果,前面的数据都丢失了。
修正后的代码
function getYoutubeVideoStatistics(){ const activeSheet = SpreadsheetApp.getActiveSheet(); const videoIDRange = activeSheet.getRange(4, 4, activeSheet.getLastRow() - 3); const videoIDRangeValues = videoIDRange.getValues(); // 转换为一维数组并过滤空ID const videoIDArray = videoIDRangeValues.map(row => row[0]).filter(id => id); const allVideoStats = []; const batchSize = 50; // API单次允许的最大ID数量 // 分批处理ID数组 for (let i = 0; i < videoIDArray.length; i += batchSize) { const batchIDs = videoIDArray.slice(i, i + batchSize).join(","); try { // 调用API,批量ID请求不支持分页,无需pageToken const statsResponse = YouTube.Videos.list("contentDetails, statistics", { id: batchIDs }); // 收集当前批次的视频数据 allVideoStats.push(...statsResponse.items); } catch (e) { console.error(`处理第 ${Math.floor(i/batchSize)+1} 批次时出错: ${e.message}`); } } // 整理表格所需数据 const vidDuration = allVideoStats.map(item => [item.contentDetails.duration]); const details = allVideoStats.map(item => [ item.statistics.viewCount || 0, item.statistics.commentCount || 0, item.statistics.likeCount || 0 ]); // 写入表格 if (allVideoStats.length > 0) { activeSheet.getRange(4, 6, vidDuration.length, 1).setValues(vidDuration); activeSheet.getRange(4, 7, details.length, 3).setValues(details); } else { console.log("未获取到任何有效视频数据"); } }
关键修改说明
- 分批请求:将ID数组按50个一组拆分,严格遵守API参数限制
- 全量数据收集:用数组存储所有批次的返回结果,避免数据丢失
- 错误容错:添加
try-catch处理单批次请求失败的情况,保证脚本不会中途崩溃 - 空值处理:过滤无效空ID,给缺失的统计字段设置默认值
0,避免写入表格时出错
内容的提问来源于stack exchange,提问作者NDS
相关产品推荐
相关产品推荐

