You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:16:00