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

基于日期自动隐藏Google Sheets行并维护部门间隔空白行

解决方案:Google Sheets 自动按日期筛选行并维护部门分隔空白行

核心实现思路

  • 根据当前日期匹配对应的Recursive_Requests选项,标记需要显示的行
  • 按Department分组,在不同部门间自动添加单个空白行,同时清理多余空白行
  • 配置每日9点自动执行的定时任务,无需手动操作

完整Apps Script代码

function filterRowsByRecursiveRequest() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const dataRange = sheet.getDataRange();
  const values = dataRange.getValues();
  const numRows = values.length;
  const numCols = values[0].length;
  
  // 映射当前日期到对应的Recursive_Requests值
  const today = new Date();
  const dayIndex = today.getDay(); // 0=周日,1=周一...6=周六
  let matchValue = '';
  switch(dayIndex) {
    case 1: matchValue = 'every_monday'; break;
    case 2: matchValue = 'every_tuesday'; break;
    case 3: matchValue = 'every_wednesday'; break;
    case 4: matchValue = 'every_thursday'; break;
    case 5: matchValue = 'every_friday'; break;
    case 6: matchValue = 'every_saturday'; break;
    default: matchValue = ''; // 周日不匹配任何工作日选项
  }

  // 先取消所有行隐藏,重置状态
  sheet.showRows(1, numRows);
  
  // 记录需要显示的行和部门分隔标记
  const visibleRows = [];
  let prevDepartment = null;
  const reqColIndex = values[0].indexOf('Recursive_Requests');
  const deptColIndex = values[0].indexOf('Department');

  // 遍历数据行(跳过第1行表头)
  for (let i = 1; i < numRows; i++) {
    const recursiveVal = values[i][reqColIndex];
    const department = values[i][deptColIndex];
    
    // 判断是否显示该行
    let shouldShow = false;
    if (recursiveVal === 'every_day' || recursiveVal === 'No') {
      shouldShow = true;
    } else if (recursiveVal === matchValue) {
      shouldShow = true;
    }
    
    if (shouldShow) {
      // 跨部门时添加空白行标记
      if (prevDepartment !== null && department !== prevDepartment) {
        visibleRows.push('blank');
      }
      visibleRows.push(i + 1); // 表格行索引从1开始
      prevDepartment = department;
    }
  }

  // 从下往上删除所有空白行,避免索引混乱
  for (let i = numRows; i >= 1; i--) {
    const rowCells = sheet.getRange(i, 1, 1, numCols).getValues()[0];
    const isBlank = rowCells.every(cell => cell === '');
    if (isBlank) {
      sheet.deleteRow(i);
    }
  }

  // 插入部门分隔空白行并调整显示
  let currentRow = 2; // 从表头下一行开始
  visibleRows.forEach(item => {
    if (item === 'blank') {
      sheet.insertRowBefore(currentRow);
      currentRow++;
    } else {
      // 确保目标行显示
      if (item <= sheet.getLastRow()) {
        sheet.showRow(item);
      }
      currentRow++;
    }
  });

  // 隐藏未标记的行
  for (let i = 2; i <= sheet.getLastRow(); i++) {
    if (!visibleRows.includes(i)) {
      sheet.hideRow(i);
    }
  }
}

// 创建每日9点自动触发任务
function createDailyTrigger() {
  // 删除已有同名触发,防止重复
  const existingTriggers = ScriptApp.getProjectTriggers();
  existingTriggers.forEach(trigger => {
    if (trigger.getHandlerFunction() === 'filterRowsByRecursiveRequest') {
      ScriptApp.deleteTrigger(trigger);
    }
  });

  // 新建每日9点触发
  ScriptApp.newTrigger('filterRowsByRecursiveRequest')
    .timeBased()
    .everyDays(1)
    .atHour(9)
    .create();
}

使用步骤

  1. 打开你的Google Sheet,点击「扩展程序」→「Apps Script」
  2. 清空默认代码,粘贴上面的脚本,保存项目(比如命名为「DateRowFilter」)
  3. 先手动运行filterRowsByRecursiveRequest,完成授权(第一次运行会提示权限申请,按指引操作即可)
  4. 运行createDailyTrigger,设置每日9点自动执行的任务

关键细节说明

  • 日期匹配:周日时只有every_day和No的行会显示,其余工作日选项仅在对应日期显示
  • 部门分隔:自动在不同部门间添加单个空白行,同时清理所有原有空白行,避免杂乱
  • 列名适配:脚本通过列名查找对应列,不需要固定列位置,只要表格包含Recursive_Requests和Department列即可
  • 定时任务:createDailyTrigger会自动管理触发任务,避免重复执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:50:30