Apps Script调用YouTube API获取100条数据时遇错误求助
问题原因分析
你的报错并非pageToken的问题,而是YouTube Data API的Videos.list接口限制单次请求最多传入50个视频ID:
- 当
maxResults=50时,你获取两页共100条视频,此时ids数组包含100个ID,直接传入YouTube.Videos.list会触发API的参数长度限制报错; - 当
maxResults<50时,若两页结果总数≤50(比如25+25=50)则请求正常,若总数超过50其实也会报错,你可能测试的是总数未达上限的场景。
修复方案
将视频ID数组按每50个一组拆分,分批调用Videos.list接口,再合并统计数据。同时优化变量声明避免潜在的覆盖问题,以下是修复后的完整代码:
function youTubeData() { const ss = SpreadsheetApp.openById('<your sheet ID>'); const activeSheet = ss.getSheetByName("YouTube Results"); activeSheet.getRange("A2:G").clear(); // 清除旧数据 const executionTime = Utilities.formatDate(new Date(), "GMT+1", "yyyy/MM/dd HH:mm:ss"); const arrSearchItems = ["attack on titan", "mob psycho 100", "demon slayer", "vinland saga"]; for (let i = 0; i < arrSearchItems.length; i++) { if(i>0) {break;} // 测试用:只显示Attack on Titan的结果 const query = arrSearchItems[i]; Logger.log(`${i+1}) ${query.toUpperCase()}`); // 获取第一页数据 let videos = YouTube.Search.list('snippet', { q: query, type: 'video', maxResults: 50, order: "viewCount", }); let allVideos = [...videos.items]; // 获取第二页数据(凑100条) if (videos.nextPageToken) { Logger.log('获取第二页数据'); videos = YouTube.Search.list('snippet', { q: query, type: 'video', maxResults: 50, order: "viewCount", pageToken: videos.nextPageToken, }); allVideos = allVideos.concat(videos.items); } // 处理基础数据 const modRes = allVideos.map(v => [ query.toUpperCase(), `https://youtu.be/${v.id.videoId}`, v.snippet.title, v.snippet.publishedAt ]); const ids = modRes.map(res => res[1].split("/")[3]); // 分批获取视频统计数据(每50个ID一批) let allStats = []; const batchSize = 50; for (let j = 0; j < ids.length; j += batchSize) { const batchIds = ids.slice(j, j + batchSize); const statsBatch = YouTube.Videos.list("statistics", { id: batchIds }); allStats = allStats.concat(statsBatch.items); } // 构建统计数据数组 const vidsStats = allStats.map(res => [ res.statistics.viewCount, res.statistics.likeCount, executionTime ]); // 写入谷歌表格 const rowStart = activeSheet.getLastRow() + 1; activeSheet.getRange(rowStart, 1, modRes.length, modRes[0].length).setValues(modRes); activeSheet.getRange(rowStart, 5, vidsStats.length, vidsStats[0].length).setValues(vidsStats); } }
关键优化点
- 拆分ID数组为50个一组的批量请求,规避API的ID数量限制
- 替换
var为let/const,避免变量提升和意外覆盖的问题 - 简化分页逻辑(仅需额外一页,直接用
if判断即可,无需while循环)
内容的提问来源于stack exchange,提问作者helloworld
相关产品推荐
相关产品推荐

