Google Apps Script调用addRecord提交数据第二次无响应问题排查
GAS 本身不存在同一会话禁止重复调用同一函数的限制,你的问题来自代码逻辑缺陷,具体原因和修复方案如下:
核心问题点
- 未定义变量异常
你已经注释掉了lock变量的声明和加锁逻辑,但catch分支中仍保留了lock.releaseLock()调用。一旦代码触发异常进入catch分支,会直接抛出ReferenceError: lock is not defined的未捕获错误,导致函数无合法返回,前端google.script.run会认为请求一直处于 pending 状态,后续重复调用就会被卡住无响应。 - 锁逻辑本身有缺陷(即使取消注释也无法正常运行)
你注释的锁代码LockService.getScriptLock.waitLock(10000)漏了方法括号,正确写法为LockService.getScriptLock().waitLock(10000);且原代码只在catch分支写了释放锁的逻辑,正常执行分支的释放锁代码被注释,会导致锁超时自动释放前,所有后续请求都拿不到锁,直接卡死。 - 异常处理不完善
原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
相关产品推荐
相关产品推荐

