如何修改谷歌表格脚本,基于单元格日期+30天条件隐藏行?
修复后的谷歌表格脚本(隐藏到期早于今日+30天的节目行)
原代码存在字符串日期拼接错误、未定义变量、语法问题,且逻辑不符合「今日加30天」的需求,以下是修复优化后的代码:
function HideExpired() { const ss = SpreadsheetApp.getActive(); const sheet = ss.getSheetByName('PledgePrograms'); const timezone = ss.getSpreadsheetTimeZone(); // 计算今日起30天后的日期,标准化为年月日格式(消除时分秒干扰) const thirtyDaysFromNow = new Date(); thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30); const normalizedThirtyDays = new Date(Utilities.formatDate(thirtyDaysFromNow, timezone, 'yyyy-MM-dd')); // 先显示所有行,避免重复隐藏导致的行无法恢复问题 sheet.showRows(1, sheet.getMaxRows()); const data = sheet.getDataRange().getValues(); data.forEach((row, index) => { // 跳过表头行(索引0对应表格第1行) if (index === 0) return; const programDate = row[10]; // K列,数组索引从0开始 const status = row[11]; // Status列(L列) // 判断日期是否有效且早于30天后的日期 const dateIsExpired = Object.prototype.toString.call(programDate) === '[object Date]' && programDate < normalizedThirtyDays; // 判断状态是否为Done/Rejected(不区分大小写) const statusIsCompleted = typeof status === 'string' && status.match(/^(Done|Rejected)$/i); // 满足任一条件则隐藏行(表格行号=数组索引+1) if (dateIsExpired || statusIsCompleted) { sheet.hideRows(index + 1); } }); }
关键修改说明
- 日期逻辑修正:直接计算「今日+30天」的日期对象,标准化为纯年月日格式,避免时分秒干扰比较精度
- 语法错误修复:移除原代码中无效的字符串拼接,修正行号计算逻辑
- 变量补全:从表格Status列(L列)获取状态值,解决
status未定义的报错 - 体验优化:先显示所有行再执行隐藏,避免重复点击按钮导致的行无法正常显示问题
- 表头保护:添加判断跳过第一行表头,防止误操作表头行
使用步骤
- 打开你的谷歌表格,点击「扩展程序」→「Apps 脚本」
- 替换原有的
HideExpired函数代码为上述代码 - 保存并运行一次(首次运行需完成权限授权)
- 返回表格,点击绑定的按钮即可执行隐藏操作
内容的提问来源于stack exchange,提问作者Tod Poirier
相关产品推荐
相关产品推荐

