Google Script分页循环获取API数据求助:仅能获取首页50条数据
搞定Google Script分页获取全部数据的方案
嘿,作为刚接触Google Script的新手,你能写出基础的请求代码已经超棒啦!针对你只能拿到第一页50条数据的问题,咱们可以通过循环分页请求来获取全部数据——核心就是不断请求下一页,直到没有更多数据为止。
核心思路
这类分页API一般有两种常见的分页方式:
- 通过
page参数指定页码(比如&page=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
相关产品推荐
相关产品推荐

