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

Google表格脚本修改需求:根据日期状态锁定指定行范围

Google表格脚本修改需求:根据日期状态锁定指定行范围

Hey Dave225,我来帮你搞定这个脚本问题!你的需求很明确:仅锁定A列日期已过期的行(仅A-E列),空白、今天或未来日期的行留作可编辑状态。原脚本之所以会锁所有行,是因为它的逻辑找的是「第一个日期早于今天的行」,然后从那一行开始直接保护到最后一行,完全忽略了中间可能存在的非过期日期行,而且还保护了整行所有列,不符合你要的A-E列范围。

下面是修改后的完整脚本,完全适配你的需求:

/**
* 仅锁定A列日期已过期的行(A-E列),空白/今天/未来日期的行保持可编辑
* 修改适配:针对指定列范围,精准判断每行日期状态
*/
function protectExpiredRows() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheets = ss.getSheets();
  const today = new Date().setHours(0, 0, 0, 0); // 标准化今天的日期(去掉时分秒)

  sheets.forEach(sheet => {
    const lastRow = sheet.getLastRow();
    if (lastRow < 2) return; // 没有数据行直接跳过

    // 1. 先清除当前工作表所有旧的范围保护
    const oldProtections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
    oldProtections.forEach(protection => {
      if (protection.canEdit()) protection.remove();
    });

    // 2. 收集所有需要保护的行号
    const rowsToProtect = [];
    for (let row = 2; row <= lastRow; row++) {
      const cellDate = sheet.getRange(row, 1).getValue();
      // 仅当单元格是日期,且日期早于今天时,标记为需要保护
      if (cellDate instanceof Date && cellDate < today) {
        rowsToProtect.push(row);
      }
    }

    // 3. 批量保护符合条件的行(仅A-E列)
    if (rowsToProtect.length === 0) return; // 没有过期行,跳过

    // 将连续的行合并成范围,减少保护规则数量(更高效)
    let currentStart = rowsToProtect[0];
    const rangesToProtect = [];
    for (let i = 1; i < rowsToProtect.length; i++) {
      if (rowsToProtect[i] !== rowsToProtect[i-1] + 1) {
        rangesToProtect.push(sheet.getRange(currentStart, 1, rowsToProtect[i-1] - currentStart + 1, 5));
        currentStart = rowsToProtect[i];
      }
    }
    // 添加最后一段连续行
    rangesToProtect.push(sheet.getRange(currentStart, 1, rowsToProtect[rowsToProtect.length-1] - currentStart + 1, 5));

    // 为每个范围设置保护
    const me = Session.getEffectiveUser();
    rangesToProtect.forEach(range => {
      const protection = range.protect().setDescription('过期日期行保护(A-E列)');
      protection.addEditor(me);
      protection.removeEditors(protection.getEditors());
      if (protection.canDomainEdit()) {
        protection.setDomainEdit(false);
      }
    });
  });
}

关键修改点说明:

  • 精准判断每行日期:不再是找第一个过期行就全锁,而是逐行检查A列,仅标记日期早于今天的行
  • 限定保护范围:只保护每行的A-E列(最后一个参数5对应E列),而非整行所有列
  • 批量合并连续行:把连续的过期行合并成一个保护范围,避免创建过多独立的保护规则,提升性能
  • 完善边界处理:加入了表头判断(从第2行开始)、无数据行跳过、无过期行跳过的逻辑,避免报错

你可以直接替换原脚本,然后测试运行:记得给脚本授权,之后可以手动运行,或者设置时间触发器(比如每天凌晨自动执行)来自动更新保护状态。

备注:内容来源于stack exchange,提问作者Dave225

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 12:59:50