You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:10:44