表单提交时基于上一行设值异常:始终写入FALSE
问题分析与解决方案
问题根源
你的脚本始终写入FALSE的原因有两个核心问题:
- 直接比较Range对象而非单元格值:
trgt.offset(0, -3)返回的是单元格Range对象,不是单元格内的实际值,和字符串"TRUE"比较永远不成立。 - 错误地将布尔值当作字符串比较:ARRAYFORMULA生成的布尔值是原生布尔类型(
true/false),而非字符串"TRUE"/"FALSE"。另外表格的匈牙利语本地化只是界面显示为IGAZ/HAMIS,实际存储的还是true/false,所以用字符串匹配必然失败。
修正后的脚本
function onFormSubmit() { var s = SpreadsheetApp.getActiveSpreadsheet(); var rcore = s.getSheetByName("test"); var lastrow = rcore.getLastRow(); var trgtRange = rcore.getRange(lastrow - 1, 9); if (trgtRange.getValue() === "") { // 一次性获取目标行左侧3个单元格的值(第6、7、8列) var leftCells = rcore.getRange(lastrow - 1, 6, 1, 3).getValues()[0]; // 检查三个值是否全为true var allTrue = leftCells.every(val => val === true); // 直接写入布尔值,界面会自动按匈牙利语显示为IGAZ/HAMIS trgtRange.setValue(allTrue); } }
关键修改说明
- 批量获取单元格值:用
getRange(lastrow -1,6,1,3).getValues()一次性获取三个单元格的值,减少Spreadsheet API调用次数,提升脚本运行效率。 - 匹配原生布尔值:直接和
true比较,而非字符串"TRUE",对应ARRAYFORMULA生成的布尔类型数据。 - 简化判断逻辑:用数组的
every()方法快速判断三个值是否全为true,代码更简洁。 - 写入布尔值而非字符串:直接传入布尔变量
allTrue,表格会根据匈牙利语环境自动显示为IGAZ(true)或HAMIS(false),无需手动写字符串。
内容的提问来源于stack exchange,提问作者davidw
相关产品推荐
相关产品推荐

