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

Google Apps Script分页获取API数据报错:getLastID未定义

解决Google Apps Script调用API分批获取数据时的ReferenceError及逻辑问题

错误直接原因

你遇到的ReferenceError: getLastID is not defined是变量名大小写拼写错误导致的:
在callAPI函数中,你定义的最后一条ID变量是getlastID(小写l),但后续赋值给lastNumber时写成了getLastID(大写L)。JavaScript是大小写敏感语言,系统无法识别未定义的getLastID变量,因此报错。

除此之外,代码还有多处逻辑缺陷,无法实现分批获取并累积数据的需求,以下是完整修复方案:


关键修复点

  1. 修正变量名拼写错误
    将lastNumber = getLastID改为lastNumber = getlastID,同时修正console.log(lastNUmber)的拼写错误(应为lastNumber)。

  2. 修复分批获取逻辑

    • 将结果数组totalTenderTransactions定义在while循环外部,避免每次循环清空数据,确保能累积所有批次的结果。
    • 移除循环内的return语句,改为循环结束后统一返回所有数据,保证多批次请求能正常执行。
    • 调整循环终止条件:当返回的数据不足250条时,判定为最后一批,终止循环。
  3. 补充缺失的params变量
    getTenderTransactions中调用callAPI时传入的params未定义,需补充(API无特殊请求头要求时,传空对象{}即可)。

  4. 修正无效日期
    2022年2月没有31日,将processed_at_max=2022-02-31+23:59:00+-0600改为processed_at_max=2022-02-28+23:59:00+-0600。

  5. 实现数据追加逻辑
    原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:30:40