如何在Apps Script中筛选日期不在指定周的行并迁移至历史表?
优化Google Apps Script实现按日期筛选迁移数据
原脚本会将「Schedule Setup」工作表的所有数据复制到「Schedule History」后清空原表,现需优化为:仅迁移C列和D列日期均不在A1(周起始日)、B1(周结束日)指定范围内的行,保留至少一列日期处于该周范围的行,同时保留按钮触发和每周六自动触发的功能。
修改后的完整脚本
function clearschedule() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const schedSheet = ss.getSheetByName("Schedule Setup"); const histSheet = ss.getSheetByName("Schedule History"); // 获取A1、B1指定的周范围日期 const weekStart = schedSheet.getRange("A1").getValue(); const weekEnd = schedSheet.getRange("B1").getValue(); // 读取原表有效数据(从第3行开始,共8列) const totalRows = schedSheet.getLastRow() - 2; if (totalRows <= 0) return; // 无数据时直接退出 const dataRange = schedSheet.getRange(3, 1, totalRows, 8); const allRows = dataRange.getValues(); const rowsToMove = []; const rowIndexesToDelete = []; // 遍历每行筛选符合迁移条件的行 allRows.forEach((row, index) => { const dateC = row[2]; // C列对应数组索引2 const dateD = row[3]; // D列对应数组索引3 // 判断单列日期是否超出周范围 const isCOutOfRange = dateC < weekStart || dateC > weekEnd; const isDOutOfRange = dateD < weekStart || dateD > weekEnd; // 仅当两列日期均超出范围时,标记为迁移/删除目标 if (isCOutOfRange && isDOutOfRange) { rowsToMove.push(row); rowIndexesToDelete.push(3 + index); // 转换为原表实际行号 } }); // 执行迁移和删除操作 if (rowsToMove.length > 0) { // 将数据写入历史表 const histLastRow = histSheet.getLastRow(); histSheet.getRange(histLastRow + 1, 1, rowsToMove.length, 8).setValues(rowsToMove); // 倒序删除原表行(避免删除行导致后续索引偏移) rowIndexesToDelete.reverse().forEach(rowNum => { schedSheet.deleteRow(rowNum); }); } }
关键逻辑说明
- 日期筛选规则:通过数组索引定位C、D列日期,分别判断是否超出A1-B1的周范围,仅当两列日期都不在范围内时才执行迁移
- 行删除优化:采用倒序删除(从大到小删除行号),避免删除前面的行导致后续行的索引错乱
- 空数据处理:先判断原表是否有有效数据,无数据时直接退出,避免无效操作
- 动态行计数:根据原表实际行数计算数据范围,替代原脚本中固定依赖
I1值的逻辑,提升准确性
内容的提问来源于stack exchange,提问作者Jade
相关产品推荐
相关产品推荐

