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

谷歌表格多条件自动排序:仅Status列非空行参与排序

解决方案

修改你的排序函数,仅处理Status列非空的行,保留未完成的任务行不受排序影响。以下是更新后的代码:

function onEdit(event){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var wss = ss.getSheetByName('Staff');
  copy1Sort(wss);
  copy2Sort(wss);
}

// Staff工作表 - 仅对Status非空的任务行排序
function copy1Sort(wss){ 
  const range = wss.getRange(4,1,9,7);
  const values = range.getValues();
  
  // 将行分为两类:Status非空的可排序行,和Status为空的未完成行
  const [sortedRows, unsortedRows] = values.reduce((acc, row) => {
    row[6].toString().trim() ? acc[0].push(row) : acc[1].push(row);
    return acc;
  }, [[], []]);
  
  // 对非空行应用排序规则
  sortedRows.sort((a, b) => {
    // 优先级(表格第6列 = 数组索引5)降序
    if (b[5] !== a[5]) return b[5] - a[5];
    // 截止日期(表格第2列 = 数组索引1)升序
    if (a[1] !== b[1]) return new Date(a[1]) - new Date(b[1]);
    // 状态(表格第7列 = 数组索引6)升序
    return a[6].localeCompare(b[6]);
  });
  
  // 合并排序后的行和未完成行,写回表格
  range.setValues([...sortedRows, ...unsortedRows]);
}

function copy2Sort(wss){ 
  const range = wss.getRange(15,1,9,7);
  const values = range.getValues();
  
  const [sortedRows, unsortedRows] = values.reduce((acc, row) => {
    row[6].toString().trim() ? acc[0].push(row) : acc[1].push(row);
    return acc;
  }, [[], []]);
  
  sortedRows.sort((a, b) => {
    if (b[5] !== a[5]) return b[5] - a[5];
    if (a[1] !== b[1]) return new Date(a[1]) - new Date(b[1]);
    return a[6].localeCompare(b[6]);
  });
  
  range.setValues([...sortedRows, ...unsortedRows]);
}

核心修改点:

  • 行分组:使用reduce()将行拆分为两组:Status列非空(去除空白字符)的行,和Status为空的行。
  • 自定义排序:替换内置的range.sort(),仅对非空行执行排序,排序规则与原逻辑一致:
    1. 优先级(降序)
    2. 截止日期(升序)
    3. 任务状态(升序)
  • 保留未完成行:Status为空的行保持原有相对顺序,放在已排序行的下方,避免填写任务信息时触发不必要的排序干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:07:48