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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:33:20