需求:日期过期后将工作表行移至底部(会议追踪场景)
Google Sheets 宏:自动将过期行移至动态「已完成」区域
核心思路
通过Google Apps Script实现:先定位工作表中「已完成」区域的起始位置(适配其动态变化特性),再遍历F列的会议日期,将过期行移动到该区域下方,并同步更新区域位置以保证后续操作的准确性。
完整脚本代码
function moveExpiredMeetings() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const dataRange = sheet.getDataRange(); const values = dataRange.getValues(); const today = new Date(); today.setHours(0, 0, 0, 0); // 仅比较日期部分,排除时间干扰 // 定位「已完成」区域的起始行(以内容含「已完成」的行为标记) let completedRowIndex = -1; for (let i = 0; i < values.length; i++) { if (values[i].includes('已完成')) { completedRowIndex = i + 1; // 转换为工作表1-based行号 break; } } if (completedRowIndex === -1) { SpreadsheetApp.getUi().alert('未找到「已完成」区域标题,请检查工作表结构'); return; } // 从下往上遍历行,避免移动行导致索引错乱 for (let i = values.length - 1; i >= 1; i--) { // 跳过第1行表头 const dateCell = values[i][5]; // F列对应索引5 if (dateCell instanceof Date && dateCell < today) { // 将过期行移至「已完成」区域的下一行 sheet.getRange(i + 1, 1, 1, sheet.getLastColumn()).moveTo(sheet.getRange(completedRowIndex, 1)); // 删除原行 sheet.deleteRow(i + 1); // 更新「已完成」区域起始行(新增行后区域下移一行) completedRowIndex++; } } }
关键细节说明
- 动态区域定位:遍历工作表找到「已完成」标记行,无论该区域随新增会议如何移动,都能准确定位目标位置。
- 反向遍历逻辑:从最后一行往表头方向遍历,避免移动行后后续行的索引偏移,确保所有过期行都能被正确处理。
- 日期比较精度:将当天日期重置为0点,只比较日期部分,防止因单元格时间差异导致误判。
- 行移动与同步:每次移动行后更新「已完成」区域的起始行号,保证新移动的行始终追加到区域末尾。
使用步骤
- 打开目标Google工作表,点击「扩展程序」→「Apps脚本」。
- 新建脚本文件,替换默认代码为上述脚本,保存并命名(如
MoveExpiredMeetings)。 - 首次运行脚本,按提示完成权限授权。
- (可选)设置自动运行:点击左侧「触发器」→「添加触发器」,选择该函数,事件源设为「时间驱动」,设置每日/每周等触发频率。
内容的提问来源于stack exchange,提问作者Tiffani
相关产品推荐
相关产品推荐

