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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 08:06:04