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

Google Script分页循环获取API数据求助:仅能获取首页50条数据

搞定Google Script分页获取全部数据的方案

嘿,作为刚接触Google Script的新手,你能写出基础的请求代码已经超棒啦!针对你只能拿到第一页50条数据的问题,咱们可以通过循环分页请求来获取全部数据——核心就是不断请求下一页,直到没有更多数据为止。

核心思路

这类分页API一般有两种常见的分页方式:

  1. 通过page参数指定页码(比如&page=2),同时响应里会返回总页数、当前页等信息;
  2. 通过offset(偏移量)和limit(每页条数)控制,比如&offset=50&limit=50表示从第51条开始取50条。

咱们先假设你的API用的是第一种page参数的方式,下面给出修改后的完整代码,同时会标注需要根据实际API调整的地方。

修改后的完整代码

function myData1() {
  // 1. 初始化核心变量
  let currentPage = 1; // 从第一页开始
  const allData = []; // 存储所有页的数据
  let hasNextPage = true; // 是否还有下一页的标志
  // 你的基础请求URL(去掉分页相关参数,后面循环拼接)
  const baseUrl = "https://apc.hypaship.com/api/3.0/Orders.json?datefrom=27-03-2018T00:01...";

  // 2. 循环请求所有分页数据
  while (hasNextPage) {
    try {
      // 拼接当前页的请求URL(如果API用offset/limit,就改成对应的参数)
      const requestUrl = `${baseUrl}&page=${currentPage}`;
      // 发送GET请求
      const response = UrlFetchApp.fetch(requestUrl);
      // 解析JSON响应
      const jsonResponse = JSON.parse(response.getContentText());

      // 假设订单数据存在jsonResponse.orders里,根据你的API实际返回结构调整!
      const currentPageData = jsonResponse.orders;

      // 判断当前页是否有数据
      if (currentPageData.length === 0) {
        hasNextPage = false;
        break;
      }

      // 将当前页数据添加到总数组里
      allData.push(...currentPageData);

      // 3. 判断是否还有下一页(二选一,根据API返回结构调整)
      // 方式A:如果API返回总页数(比如jsonResponse.totalPages)
      // hasNextPage = currentPage < jsonResponse.totalPages;
      // 方式B:如果API没返回总页数,就通过当前页数据条数判断(每页最多50条)
      hasNextPage = currentPageData.length === 50;

      // 页码自增,准备请求下一页
      currentPage++;

      // 可选:添加1秒延迟,避免请求太频繁被API限流
      Utilities.sleep(1000);
    } catch (error) {
      // 捕获请求异常,避免脚本直接崩溃
      Logger.log(`请求第${currentPage}页失败:${error.message}`);
      hasNextPage = false; // 也可以改成继续尝试,根据你的需求调整
    }
  }

  // 4. 将所有数据写入Google Sheet
  if (allData.length > 0) {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    // 可选:清空现有数据
    sheet.clearContents();

    // 写入表头(取第一条数据的键作为表头,根据实际情况调整)
    const headers = Object.keys(allData[0]);
    sheet.appendRow(headers);

    // 批量写入所有数据行
    allData.forEach(order => {
      sheet.appendRow(Object.values(order));
    });

    Logger.log(`数据获取完成,共获取${allData.length}条记录`);
  } else {
    Logger.log("没有获取到任何数据");
  }
}

关键调整点说明

  • 分页参数拼接:如果你的API不用page,而是用offset和limit,就把requestUrl改成:
    const requestUrl = `${baseUrl}&offset=${(currentPage-1)*50}&limit=50`;
    
  • 响应结构适配:一定要根据你的API实际返回的JSON结构,修改jsonResponse.orders这部分——比如如果数据存在jsonResponse.data里,就改成jsonResponse.data。
  • 分页判断逻辑:优先用API返回的总页数来判断,这样更准确;如果API没返回总页数,再用数据条数判断(因为最后一页的数据肯定少于50条)。
  • 异常处理:加了try...catch可以避免某一页请求失败导致整个脚本崩溃,你也可以根据需求改成重试几次再停止。

测试小技巧

  • 刚开始测试时,可以给循环加个限制,比如while (hasNextPage && currentPage <= 3),先只请求前3页,确认逻辑没问题再放开。
  • 用Logger.log(currentPageData)查看单页返回的数据结构,确保你取到了正确的内容。

内容的提问来源于stack exchange,提问作者Tots2000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:28:49