Google Apps Script优化:清除任务后仅收缩指定区域空白行
优化后的任务归档Google Apps Script
针对原脚本处理空白行导致运行缓慢的问题,以下是修改后的代码,仅对清除行下方有任务内容(E列非空)的行执行上移操作,同时保留归档、排序、维持500行格式的核心功能,且仅操作B:X列区域:
/** * @OnlyCurrentDoc */ function archiveTasks() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var taskSheet = ss.getSheetByName("Task Masterlist"); var archiveSheet = ss.getSheetByName("Archive"); // 定义待检查的范围 var range = taskSheet.getRange("B28:X500"); var values = range.getValues(); // 倒序遍历行,避免索引错乱 for (var i = values.length - 1; i >= 0; i--) { if (values[i][0] === true) { // 检查B列是否为True // 获取待归档行数据 var row = values[i]; // 找到归档表中从第18行开始的第一个空行 var emptyRow = findFirstEmptyRow(archiveSheet, 18); // 将行数据写入归档表 archiveSheet.getRange("B" + emptyRow + ":X" + emptyRow).setValues([row]); // 为归档行添加时间戳(Y列) var timeZone = "America/Toronto"; // 可根据需要修改时区 var date = new Date(); var formattedDate = Utilities.formatDate(date, timeZone, "yyyy-MM-dd HH:mm:ss"); archiveSheet.getRange("Y" + emptyRow).setValue(formattedDate); // 清除当前行内容但保留公式 var formulas = taskSheet.getRange(28 + i, 2, 1, 23).getFormulas()[0]; taskSheet.getRange(28 + i, 2, 1, 23).clearContent(); taskSheet.getRange(28 + i, 2, 1, 23).setFormulas([formulas]); // 仅将当前行下方有任务内容(E列非空)的行上移 shiftRowsUpWithContentCheck(taskSheet, 28 + i, 500); } } // 按到期日(F列,对应排序参数column:6)升序排序剩余任务 taskSheet.getRange("B28:X500").sort({column: 6, ascending: true}); // 维持表中始终有500行带格式和公式的行 maintainRowCount(taskSheet, 500); } function findFirstEmptyRow(sheet, startRow) { var data = sheet.getRange("B" + startRow + ":B").getValues(); for (var i = 0; i < data.length; i++) { if (!data[i][0]) { return startRow + i; } } return startRow + data.length; } function shiftRowsUpWithContentCheck(sheet, startRow, endRow) { var currentRow = startRow; // 遍历到倒数第二行,因为要取下一行数据 while (currentRow < endRow) { var nextRow = currentRow + 1; // 检查下一行的E列是否有内容(判断是否为有效任务行) var eColumnValue = sheet.getRange("E" + nextRow).getValue(); if (!eColumnValue) { // 下一行无内容,停止上移 break; } // 获取下一行的B:X列数据和公式 var nextRange = sheet.getRange(nextRow, 2, 1, 23); var nextValues = nextRange.getValues(); var nextFormulas = nextRange.getFormulas(); // 将下一行数据覆盖到当前行 sheet.getRange(currentRow, 2, 1, 23).setValues(nextValues); sheet.getRange(currentRow, 2, 1, 23).setFormulas(nextFormulas); currentRow++; } // 清除最后一个被移动的行的内容 sheet.getRange(currentRow, 2, 1, 23).clearContent(); } function maintainRowCount(sheet, targetRowCount) { var lastRow = sheet.getLastRow(); var numRowsToAdd = targetRowCount - lastRow; if (numRowsToAdd > 0) { var sourceRange = sheet.getRange(400, 2, 1, 23); // 从第400行复制格式和公式 for (var j = 0; j < numRowsToAdd; j++) { var targetRange = sheet.getRange(lastRow + 1 + j, 2, 1, 23); sourceRange.copyTo(targetRange); } } }
关键改进点
- 优化行上移逻辑:新的
shiftRowsUpWithContentCheck函数会检查下一行的E列(任务内容列)是否有值,仅移动有效任务行,跳过底部空白行,大幅提升运行效率 - 保留核心功能:完整保留原脚本的任务归档、按到期日排序、维持500行格式的功能
- 严格限定操作范围:所有数据操作仅针对B:X列,不影响表格其他列的内容
内容的提问来源于stack exchange,提问作者Lucie
相关产品推荐
相关产品推荐

