Google Apps Script 重复校验与空数组判断逻辑异常,持续误报存在重复
问题根因定位
1. 单元格读取范围计算错误
getRange(起始行号, 起始列号, 读取行数)方法的第三个参数为需要抓取的总行数,不是读取的截止行号。你在readData函数中直接把工作表最后一行的行号lastRow作为行数传入,从第6行开始读取时,会一直延伸到超出最后一行的位置,读到大量完全空白的单元格。
2. 空白单元格被误判为重复值
getValues方法不会自动过滤空白单元格,范围里的空白位置会返回空字符串""。这些空字符串经过排序后会连续排列,直接被findDuplicates函数判定为重复项,最终导致duplicates数组长度永远大于0,无论是否输入真实数据,都会触发重复提示。
3. 变量作用域不匹配
你全局定义的活动表变量为ssSheet,但readData函数中调用的是未定义的sheet变量,哪怕运行时靠全局变量兜底,也可能读取到错误的工作表范围,进一步放大取值异常的问题。
4. 校验分支顺序错误
当前逻辑先判断重复、再判断空值,就算存在空数据集,也会因为所有空值被判定为重复,永远走不到空值提示的分支。
修正后的可运行代码
var ss = SpreadsheetApp.getActiveSpreadsheet(); var ssSheet = ss.getActiveSheet(); function readData() { var dataColumn = 3; var startRow = 6; var lastRow = ssSheet.getLastRow(); // 修正:计算正确的读取总行数 var readRowCount = lastRow - startRow + 1; // 修正:使用全局定义的ssSheet变量 var columnRange = ssSheet.getRange(startRow, dataColumn, readRowCount); var rangeArray = columnRange.getValues(); // 转换为一维数组 rangeArray = [].concat.apply([], rangeArray); // 过滤空值,避免空白单元格被纳入重复校验 rangeArray = rangeArray.filter(item => item !== "" && item !== null); return rangeArray; } function findDuplicates(dataAll) { if (dataAll.length === 0) return []; var sortedData = dataAll.slice().sort(); var duplicates = []; for (var i = 0; i < sortedData.length - 1; i++) { if (sortedData[i + 1] == sortedData[i]) { duplicates.push(sortedData[i]); } } return duplicates; } function sendDataAndTimestamp2() { var dataArray = readData(); var duplicates = findDuplicates(dataArray); // 调整判断顺序:优先校验空数据集 if (dataArray.length === 0) { SpreadsheetApp.getUi().alert("You have not input any tallies.", SpreadsheetApp.getUi().ButtonSet.OK); return; } // 校验重复值 if (duplicates.length !== 0) { SpreadsheetApp.getUi().alert("Your tallies include duplicates, please remove them then try again.", SpreadsheetApp.getUi().ButtonSet.OK); Logger.log(duplicates); return; } // 校验通过后的发送逻辑 var result = SpreadsheetApp.getUi().alert("You're about to notify scheduler of the following number of tallies: " + tallyAmountNumberOnly, SpreadsheetApp.getUi().ButtonSet.OK_CANCEL); if(result === SpreadsheetApp.getUi().Button.OK) { // 邮件发送与数据推送逻辑 } }
修正逻辑说明
- 修正读取行数的计算公式,不会多取超出有效数据范围的空白单元格
- 增加数组空值过滤步骤,排除所有空字符串、null值对重复校验的干扰
- 调整校验优先级:先判断是否为空数据集,再判断是否存在重复,分支流转符合设计预期
- 校验不通过时增加
return语句,直接终止函数执行,不会继续走后续发送流程 - 修正变量作用域不匹配的问题,确保读取的是目标工作表的正确范围
内容的提问来源于stack exchange,提问作者Micah
相关产品推荐
相关产品推荐

