Apps Script函数间传值时allValid始终为true的问题求助
核心问题定位
1. 异步时序导致的变量读取失效
google.script.run 属于非阻塞异步调用,请求发出去之后,后续同步代码会立刻往下执行,不会等待服务端返回结果。
你代码里写的console.log(allValid)、还有末尾的if (!allValid)判断,会在两个查询请求刚发出去、onLOGIN/onSSCC两个成功回调还没触发的时候就执行完毕。等回调里把allValid改成false的时候,判断分支早就走完了,自然永远看到allValid是初始的true。
2. 首轮表单校验逻辑写错
逐字段校验的代码存在值覆盖问题:
idKeys.forEach(function(id){ isValid = checkIfValid(id,toValidate[id]); allValid = isValid; });
循环里每跑一次,就把allValid直接替换成当前轮次的校验结果。举个实际场景:第一个LOGIN字段校验不通过把allValid设成false,后面SSCC、PLACE两个字段如果校验通过,直接又把allValid覆盖回true,完全失去了“一个校验不通过整体不通过”的预期效果。
3. 服务端代码拼写错误
searchSSCC函数里取参数时写的是UserInfo.zSSCС——最后那个С是西里尔语的C,不是英文输入的C,和前端传的全英文参数名zSSCC对不上,永远拿不到正确的校验值,就算时序问题修好了,这个校验也永远匹配不到结果。
4. 零散代码隐患
- 校验时用的临时变量
isValid没有加let/const声明,会变成全局变量,容易出现变量被意外修改的问题 - 最后执行
addRecord(idElem)时,引用的idElem从来没有在代码里定义过,跑到这一步会直接报未定义错误
对应修正方法
- 调整首轮校验的逻辑,不要在循环里直接覆盖
allValid,改成累积判断结果,只要任意环节不通过就保持allValid为false,正确写法参考:idKeys.forEach(function(id){ const currentValid = checkIfValid(id, toValidate[id]); allValid = allValid && currentValid; }); - 把异步的服务端查询流程串起来:用Promise封装两个查询方法,等所有结果都返回之后,再统一读
allValid的值、走对应的判断分支,绝对不能在同步代码的位置,直接读取异步回调里修改的变量。 - 修正服务端的拼写错误,把
searchSSCC里的西里尔字符替换成和前端一致的英文拼写,保证参数能正常传递匹配。 - 给所有临时变量加声明,清理代码里不存在的变量引用。
内容的提问来源于stack exchange,提问作者Dmitriy Rudakov
相关产品推荐
相关产品推荐

