Google Apps Script分页获取API数据报错:getLastID未定义
解决Google Apps Script调用API分批获取数据时的ReferenceError及逻辑问题
错误直接原因
你遇到的ReferenceError: getLastID is not defined是变量名大小写拼写错误导致的:
在callAPI函数中,你定义的最后一条ID变量是getlastID(小写l),但后续赋值给lastNumber时写成了getLastID(大写L)。JavaScript是大小写敏感语言,系统无法识别未定义的getLastID变量,因此报错。
除此之外,代码还有多处逻辑缺陷,无法实现分批获取并累积数据的需求,以下是完整修复方案:
关键修复点
修正变量名拼写错误
将lastNumber = getLastID改为lastNumber = getlastID,同时修正console.log(lastNUmber)的拼写错误(应为lastNumber)。修复分批获取逻辑
- 将结果数组
totalTenderTransactions定义在while循环外部,避免每次循环清空数据,确保能累积所有批次的结果。 - 移除循环内的
return语句,改为循环结束后统一返回所有数据,保证多批次请求能正常执行。 - 调整循环终止条件:当返回的数据不足250条时,判定为最后一批,终止循环。
- 将结果数组
补充缺失的
params变量getTenderTransactions中调用callAPI时传入的params未定义,需补充(API无特殊请求头要求时,传空对象{}即可)。修正无效日期
2022年2月没有31日,将processed_at_max=2022-02-31+23:59:00+-0600改为processed_at_max=2022-02-28+23:59:00+-0600。实现数据追加逻辑
原pasteArrayIntoSheet会覆盖已有数据,修改为找到表格最后一行,将新数据追加到末尾,避免覆盖之前的批次数据。
修复后的完整代码
// 全局常量定义(建议放在代码最顶部) const SPREADSHEET_ID = "你的表格ID"; function getTenderTransactions() { const root = 'https://<url address>'; const endpoint = 'tender_transactions.json?'; const recordCount = 'limit=250&'; // 修正无效日期:2022年2月无31日 const startDate = 'processed_at_min=2022-01-01+00:01:00+-0600&'; const endDate = 'processed_at_max=2022-02-28+23:59:00+-0600'; const url = root + endpoint + recordCount + startDate + endDate; // 补充params变量,API无特殊要求时传空对象 const allTransactions = callAPI(url, 0, {}); pasteArrayIntoSheet(SPREADSHEET_ID, allTransactions, "Copy of tender transactions"); } function callAPI(url, lastNumber, params) { // 结果数组定义在循环外部,用于累积所有批次数据 let totalTenderTransactions = []; let idNumber = '&since_id=' + lastNumber; while (lastNumber !== -1) { let response = UrlFetchApp.fetch(url + idNumber, params); let responseCode = response.getResponseCode(); let data = JSON.parse(response.getContentText()); if (responseCode === 200) { const results = data.tender_transactions; // 处理当前批次数据 results.forEach(row => { const id = row.id; const order_id = row.order_id; const amount = row.amount; const date = row.processed_at; const paymentMethod = row.payment_method; totalTenderTransactions.push([id, order_id, amount, date, paymentMethod]); }); // 修正变量名拼写 let getlastID = totalTenderTransactions[totalTenderTransactions.length - 1][0]; console.log('last ID in call - ' + getlastID); if (results.length < 250) { // 数据不足250条,判定为最后一批 lastNumber = -1; } else { // 更新lastNumber,准备下一次请求 lastNumber = getlastID; console.log(lastNumber); idNumber = '&since_id=' + lastNumber; console.log(idNumber); } } else { console.log("Error: " + responseCode); // 遇错误终止循环 lastNumber = -1; } } // 循环结束后返回所有累积数据 return totalTenderTransactions; } // 修正粘贴逻辑:追加数据到表格末尾 function pasteArrayIntoSheet(id, arrayName, sheetName) { const ss = SpreadsheetApp.openById(id); const sheet = ss.getSheetByName(sheetName); if (!sheet) { console.log("指定工作表不存在"); return; } // 获取表格最后一行行号 const lastRow = sheet.getLastRow(); // 若只有表头则从第2行开始,否则从下一行开始 const startRow = lastRow === 1 ? 2 : lastRow + 1; // 粘贴数据 sheet.getRange(startRow, 1, arrayName.length, arrayName[0].length).setValues(arrayName); }
内容的提问来源于stack exchange,提问作者Maicol
相关产品推荐
相关产品推荐

