如何修改Google Apps Script实现Sheet数据过滤与排序
Google Apps Script 修改方案:满足过滤与排序需求
以下是针对你的需求修改后的完整代码,以及关键修改点说明:
修改后完整代码
function myFunction() { const srcSheetName = "Input"; const dstSheetName = "Output"; // 获取工作表对象 const ss = SpreadsheetApp.getActiveSpreadsheet(); const [srcSheet, dstSheet] = [srcSheetName, dstSheetName].map(s => ss.getSheetByName(s)); // 获取源数据 const [srcHeader, ...srcValues] = srcSheet.getDataRange().getDisplayValues(); // 定位Division字段在输出条目中的索引(条目格式为[Code, ...原列],故原索引+1) const divisionIndex = srcHeader.indexOf("Division") + 1; // 处理数据:过滤非数值Code,按Code分组并排序Assistant优先 const dataMap = srcValues.reduce((m, [areaStr, ...rowValues]) => { if (!areaStr) return m; // 拆分Area列的多个Code areaStr.split(",").forEach(codeStr => { const code = codeStr.trim(); // 仅保留纯数字格式的Code if (/^\d+$/.test(code)) { const entry = [code, ...rowValues]; // 按Code分组存储条目数组 if (m.has(code)) { m.get(code).push(entry); } else { m.set(code, [entry]); } } }); return m; }, new Map()); // 将分组数据排序后扁平化,适配原输出格式 let dstValues = [...dataMap.values()].map(group => { // 排序规则:Division包含Assistant的条目优先排列 group.sort((a, b) => { const aIsAssistant = a[divisionIndex].includes("Assistant"); const bIsAssistant = b[divisionIndex].includes("Assistant"); // 布尔值转数字实现排序:有Assistant的条目权重更高 return (bIsAssistant ? 1 : 0) - (aIsAssistant ? 1 : 0); }); // 扁平化分组数组,保持原脚本的一维结构 return group.flat(); }); // 生成表头并填充空值(沿用原逻辑) if (dstValues.length === 0) return; const maxLen = Math.max(...dstValues.map(r => r.length)); srcHeader[0] = "Code"; const dstHeader = [...Array(maxLen / srcHeader.length)].flatMap(_ => srcHeader); dstValues = [dstHeader, ...dstValues.map(r => [...r, ...Array(maxLen - r.length).fill(null)])]; // 写入目标工作表 dstSheet.clear().getRange(1, 1, dstValues.length, dstValues[0].length).setNumberFormat("@").setValues(dstValues); }
关键修改点说明
1. 过滤非数值型Code
在拆分Area列后的Code校验环节,添加了正则表达式/^\d+$/.test(code),仅允许纯数字格式的Code进入后续处理,直接过滤掉「Sales - Bike/Car/Boat/Plane」这类非数值条目。
2. 同一Code分组内Assistant条目优先排序
- 先通过
srcHeader.indexOf("Division") + 1确定Division字段在输出条目中的位置(因为输出条目开头新增了Code列,索引需+1)。 - 将原脚本中直接拼接同Code条目的逻辑,改为按Code存储条目数组,而非一维拼接,为排序操作提供基础。
- 对每个Code对应的条目数组执行排序:通过判断Division字段是否包含「Assistant」,将符合条件的条目排在组内最前面。排序逻辑利用布尔值转数字的特性,确保有Assistant的条目权重更高。
- 排序完成后将数组扁平化,保持原脚本的一维输出结构,确保后续表头生成和空值填充逻辑正常运行。
内容的提问来源于stack exchange,提问作者Petey2005
相关产品推荐
相关产品推荐

