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

Google Apps Script调用addRecord提交数据第二次无响应问题排查

GAS 本身不存在同一会话禁止重复调用同一函数的限制,你的问题来自代码逻辑缺陷,具体原因和修复方案如下:

核心问题点

  1. 未定义变量异常
    你已经注释掉了lock变量的声明和加锁逻辑,但catch分支中仍保留了lock.releaseLock()调用。一旦代码触发异常进入catch分支,会直接抛出ReferenceError: lock is not defined的未捕获错误,导致函数无合法返回,前端google.script.run会认为请求一直处于 pending 状态,后续重复调用就会被卡住无响应。
  2. 锁逻辑本身有缺陷(即使取消注释也无法正常运行)
    你注释的锁代码LockService.getScriptLock.waitLock(10000)漏了方法括号,正确写法为LockService.getScriptLock().waitLock(10000);且原代码只在catch分支写了释放锁的逻辑,正常执行分支的释放锁代码被注释,会导致锁超时自动释放前,所有后续请求都拿不到锁,直接卡死。
  3. 异常处理不完善
    原catch分支仅返回Error字符串,没有记录具体异常信息,无法快速定位运行时报错原因。

修复后的代码

GAS 端addRecord函数

function addRecord(rows) {
  var url = 'https://docs.google.com/spreadsheets/d/-myProjectID-/edit#gid=0';
  var ss = SpreadsheetApp.openByUrl(url);
  var webAppSheet = ss.getSheetByName("FORM DATA");
  var row = rows.length;
  var column = rows[0].length;

  // 正确的锁逻辑写法
  var lock = LockService.getScriptLock();
  try {
    lock.waitLock(10000); // 最多等待10秒获取锁
    webAppSheet.getRange(webAppSheet.getLastRow() + 1, 1, row, column).setValues(rows);
    return "Ok"
  } catch (ex) {
    console.error("提交出错:", ex); // 打印异常到执行日志方便排查
    return "Error: " + ex.toString();
  } finally {
    // 无论执行成功失败都释放锁,避免死锁
    if (lock.hasLock()) {
      lock.releaseLock();
    }
  }
}

前端调用注意事项

不要复用之前的google.script.run实例,每次重试都重新构造调用链即可,示例:

// 封装独立的提交函数,每次调用都是新的实例
function submitRows(rows) {
  google.script.run
    .withSuccessHandler(onSuccess)
    .withFailureHandler(onFailure)
    .addRecord(rows);
}
// 重试时直接调用 submitRows(rows) 即可

修复完成后同一会话下可以正常多次调用addRecord函数,无需刷新页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:36:03