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

Google Apps Script多条件数据筛选功能异常求助

Google Apps Script 多条件筛选异常问题

我正尝试通过Google Apps Script将「CURENT POOL DATA SHEET」中的数据按多条件筛选至「REPORTS」工作表,但现有代码返回全部数据而非符合条件的数据。需求如下:

  • 若筛选条件为空则跳过该条件
  • 多条件叠加时仅返回同时符合所有非空条件的行

以下是我编写的代码:

function myReport(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var datasht = ss.getSheetByName("CURENT POOL DATA SHEET");
var reportsht = ss.getSheetByName("REPORTS")
var rng = datasht.getRange(2, 1, datasht.getLastRow(),14).getValues();
var Criteria1 = reportsht.getRange("B4").getValue();
var Criteria2 = reportsht.getRange("C4").getValue();
var Criteria3 = reportsht.getRange("D4").getValue();
var Criteria4 = reportsht.getRange("E4").getValue();
var Criteria5 = reportsht.getRange("F4").getValue();
var Criteria6 = reportsht.getRange("G4").getValue();
var Criteria7 = reportsht.getRange("H4").getValue();
var Criteria8 = reportsht.getRange("I4").getValue();
var Criteria9 = reportsht.getRange("J4").getValue();
var Criteria10 = reportsht.getRange("K4").getValue();
var Criteria11 = reportsht.getRange("L4").getValue();
var Criteria12 = reportsht.getRange("M4").getValue();
var Criteria13 = reportsht.getRange("N4").getValue();


var fData = rng.filter(function(e){return e[1]==Criteria1 || e[2]==Criteria2 
|| e[3]==Criteria3 || e[4]==Criteria4 || e[5]==Criteria5 || e[6]==Criteria6 || e[7]==Criteria7 
|| e[8]==Criteria8 || e[9]==Criteria9 || e[10]==Criteria10 || e[11]==Criteria11 
|| e[12]==Criteria12 || e[13]==Criteria13 });
//var fData = rng.filter(function(e){return e[1]==criteria1});
reportsht.getRange(5,1,fData.length,14).setValues(fData);
}


function clearFilter() 
{
  var myGoogleSheet= SpreadsheetApp.getActiveSpreadsheet(); 
  var shUserForm    = myGoogleSheet.getSheetByName("Reports"); 
  var ui = SpreadsheetApp.getUi();
  var response = ui.alert("Reset Confirmation", 'Do you want to reset this form?',ui.ButtonSet.YES_NO);

 if (response == ui.Button.YES) 
  {
     
  shUserForm.getRange("A5:N3724").clear(); 
  
 shUserForm.getRange("A5:N3724").setBackground('#FFFFFF');
 
 
  return true ;
  
  }
}

报告工作表截图:
报告工作表截图

我是Apps Script新手,希望得到帮助解决该问题。


问题分析与修正代码

原代码核心问题是用了||(逻辑或),只要满足任意一个条件就保留行,导致返回全部数据。需要改成非空条件必须同时满足的逻辑,同时优化冗余的条件读取写法。

修正后的代码:

function myReport() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const datasht = ss.getSheetByName("CURENT POOL DATA SHEET");
  const reportsht = ss.getSheetByName("REPORTS");
  
  // 获取有效数据源(从第2行开始,排除表头)
  const dataRowCount = datasht.getLastRow() - 1;
  const rng = datasht.getRange(2, 1, dataRowCount, 14).getValues();
  
  // 批量读取B4到N4的筛选条件
  const criteriaList = reportsht.getRange("B4:N4").getValues()[0];
  
  // 筛选逻辑:所有非空条件必须同时匹配
  const fData = rng.filter(row => {
    for (let i = 0; i < criteriaList.length; i++) {
      const criteria = criteriaList[i];
      // 条件非空但不匹配时,直接排除该行
      if (criteria !== "" && row[i + 1] !== criteria) {
        return false;
      }
    }
    // 所有非空条件都满足,保留该行
    return true;
  });
  
  // 清空旧结果并写入新数据
  reportsht.getRange(5, 1, 3720, 14).clear();
  if (fData.length > 0) {
    reportsht.getRange(5, 1, fData.length, 14).setValues(fData);
  }
}

function clearFilter() {
  const myGoogleSheet = SpreadsheetApp.getActiveSpreadsheet();
  const shUserForm = myGoogleSheet.getSheetByName("Reports");
  const ui = SpreadsheetApp.getUi();
  const response = ui.alert("Reset Confirmation", 'Do you want to reset this form?', ui.ButtonSet.YES_NO);

  if (response === ui.Button.YES) {
    shUserForm.getRange("A5:N3724").clear();
    shUserForm.getRange("A5:N3724").setBackground('#FFFFFF');
    return true;
  }
}

关键修改点

  • 把筛选逻辑从「或」改为「逐个校验非空条件,不匹配则排除」,实现多条件同时满足的效果
  • 批量读取筛选条件,替代逐个getRange的冗余写法
  • 修正数据源范围:排除表头行,避免空行干扰
  • 写入数据前清空结果区域,防止旧数据残留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:25:06