You need to enable JavaScript to run this app. 为什么Google Apps Script数组去重时循环内的if判断语句不执行?
优惠活动
大模型
产品
解决方案
定价
更多

为什么Google Apps Script数组去重时循环内的if判断语句不执行?

重复值判断分支不触发问题排查

我始终无法理解为什么写的if判断语句完全不执行。未加调试日志的正常版本判断逻辑本是直接写为if(answerArray[z] == answerArray[z-1]),按逻辑第三次循环时就应该命中该分支,实际运行时分支完全没有触发,换成严格相等判断===也没有效果。

调试版代码

为了定位问题加了大量Logger日志,调试版代码如下:

/////////////////////////////////////////////////////////////////////////
//  获取选项值
/////////////////////////////////////////////////////////////////////////
  var lastRow = sheet.getLastRow();
  var rawArray= sheet.getRange('D6:D'+lastRow).getValues();  
  var answerArray = rawArray.filter(function(n){return n != ''});   // 移除空值
  answerArray.sort();

/////////////////////////////////////////////////////////////////////////
//  移除重复选项
/////////////////////////////////////////////////////////////////////////
  var arrayContents = "";
  for (var z = 0;z<answerArray.length;z=z+1) {arrayContents = arrayContents + answerArray[z] + ", ";}

  Logger.log("RemoveDupes Started");
  Logger.log("Array Contents: " + arrayContents);
  Logger.log("answerArray[0] = "+answerArray[0]);
  for(var z = 1; z< answerArray.length; z=z+1){
      var current = answerArray[z];
      var previous = answerArray[z-1];
      Logger.log("Current = " + current+"; Previous = " + previous);
      if(current == previous) 
      {
        Logger.log("Duplicate Found");
          answerArray.splice(z,1);
          z=z-1;                  // 数组长度缩短后回退索引,避免漏判相邻重复值
      }
  }
  Logger.log("RemoveDupes Ended");

实际运行日志

11:40:53 AM Notice  Execution started
11:41:01 AM Info    RemoveDupes Started
11:41:01 AM Info    Array Contents: A, B, C, C, D, 
11:41:01 AM Info    answerArray[0] = A
11:41:01 AM Info    Current = B; Previous = A
11:41:01 AM Info    Current = C; Previous = B
11:41:01 AM Info    Current = C; Previous = C
11:41:01 AM Info    Current = D; Previous = C
11:41:01 AM Info    RemoveDupes Ended

问题核心:日志打印时明明显示当前值、上一个值都是C,但相等判断始终不成立。

问题根因

从Google SheetsgetValues()接口返回的单元格值并非纯字符串,而是附带表格元数据的封装对象。这类对象在拼接字符串、日志输出时会自动调用toString()方法,把展示文本打印为C,但两个对象本身的引用、内部结构完全不一致,因此无论用==还是===都无法判定二者相等。

最终解决方案

把数组元素强制转换为纯字符串,剥离接口返回值附带的元数据后,判断逻辑即可正常运行。修改后的代码如下:

/////////////////////////////////////////////////////////////////////////
//  获取选项值
/////////////////////////////////////////////////////////////////////////
  var lastRow = sheet.getLastRow();
  var rawArray = [""];
  var directInputArray = sheet.getRange('D6:D'+lastRow).getValues();  
  for(var z = 0; z< directInputArray.length; z=z+1){
     rawArray[z] = String(directInputArray[z]);  // 所有值强制转为纯字符串,移除附带元数据
  }

  var answerArray = rawArray.filter(function(n){return n != ''});   // 移除空值
  answerArray.sort();

/////////////////////////////////////////////////////////////////////////
//  移除重复选项
/////////////////////////////////////////////////////////////////////////
  for(var z = 1; z< answerArray.length; z=z+1){
      if(answerArray[z] == answerArray[z-1]) {
          answerArray.splice(z,1);
          z=z-1;                  // 数组长度缩短后回退索引,避免漏判相邻重复值
      }
  }

内容的提问来源于stack exchange,提问作者DLove

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 23:36:03