基于日期自动隐藏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(); }
使用步骤
- 打开你的Google Sheet,点击「扩展程序」→「Apps Script」
- 清空默认代码,粘贴上面的脚本,保存项目(比如命名为「DateRowFilter」)
- 先手动运行
filterRowsByRecursiveRequest,完成授权(第一次运行会提示权限申请,按指引操作即可) - 运行
createDailyTrigger,设置每日9点自动执行的任务
关键细节说明
- 日期匹配:周日时只有
every_day和No的行会显示,其余工作日选项仅在对应日期显示 - 部门分隔:自动在不同部门间添加单个空白行,同时清理所有原有空白行,避免杂乱
- 列名适配:脚本通过列名查找对应列,不需要固定列位置,只要表格包含
Recursive_Requests和Department列即可 - 定时任务:
createDailyTrigger会自动管理触发任务,避免重复执行
内容的提问来源于stack exchange,提问作者Michael Benton
相关产品推荐
相关产品推荐

