如何用单个条件同时筛选多列,显示符合条件的行?
解决方案
要实现A、C、E任意一列包含指定文本即显示对应行的筛选效果,核心是利用whenFormulaSatisfied方法编写行级判断逻辑——注意不能用FILTER数组公式,因为筛选条件需要的是单个单元格返回布尔值的表达式,而非范围返回结果。
修改后的完整代码
function showPrompt() { var ui = SpreadsheetApp.getUi(); var result = ui.prompt( '请输入筛选关键词', '关键词:', ui.ButtonSet.OK_CANCEL); var button = result.getSelectedButton(); var title = result.getResponseText(); if (button == ui.Button.OK) { createFilter(title); } } function createFilter(title) { var spreadsheet = SpreadsheetApp.getActive(); var sheet = spreadsheet.getActiveSheet(); // 移除现有筛选 var existingFilter = sheet.getFilter(); if(existingFilter){ existingFilter.remove(); } // 创建新筛选 var dataRange = sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()); dataRange.createFilter(); // 转义关键词中的双引号,避免公式语法错误 var escapedTitle = title.replace(/"/g, '""'); // 构建筛选条件:判断当前行A/C/E列是否包含关键词 var criteria = SpreadsheetApp.newFilterCriteria() .whenFormulaSatisfied(`=OR(ISNUMBER(SEARCH("${escapedTitle}",A1)),ISNUMBER(SEARCH("${escapedTitle}",C1)),ISNUMBER(SEARCH("${escapedTitle}",E1)))`) .build(); // 将条件应用到第一列(任意列均可,公式是针对整行的逻辑判断) sheet.getFilter().setColumnFilterCriteria(1, criteria); };
关键说明
公式逻辑:
SEARCH("关键词",A1):在A1单元格中查找关键词,找到则返回位置,否则返回错误ISNUMBER(...):将SEARCH结果转为布尔值(找到为TRUE,否则FALSE)OR(...):只要A/C/E任意一列满足条件,整行就返回TRUE,即显示该行- 公式中
A1/C1/E1是相对引用,筛选会自动将其应用到每一行(比如第二行对应A2/C2/E2)
双引号转义:
如果用户输入的关键词包含双引号,直接写入公式会导致语法错误,因此用title.replace(/"/g, '""')把单个双引号替换为两个(Google Sheets公式的双引号转义规则)代码优化:
原代码中重复获取激活范围的逻辑被简化,直接用sheet.getFilter()获取现有筛选,比通过范围获取更高效
内容的提问来源于stack exchange,提问作者kq76
相关产品推荐
相关产品推荐

