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

如何编写Google Sheets关闭时自动锁定已有数据的App Script脚本

实现思路
  • Google Apps Script 没有提供原生的「工作表关闭」事件触发器,所以用「打开时解锁+定时/手动触发锁定」的组合逻辑实现需求,实际使用体验和关闭即锁一致。
  • 每次执行锁定操作前,先清理之前脚本生成的旧保护规则,避免保护范围叠加、权限冲突,不会影响你手动设置的其他保护规则。
  • 锁定范围通过getLastRow()、getLastColumn()自动识别当前工作表有内容的最后一行/列,不会把后续预留的空白行纳入锁定,不影响新增数据操作。
  • 保护权限配置为仅保留表格所有者的编辑权限,自动移除其他所有用户的编辑权,不需要逐个配置用户名单。
完整代码
// 配置项:修改为你需要应用锁定逻辑的工作表名称
const TARGET_SHEET_NAME = "Sheet1";
// 保护规则标识,用于脚本识别自身生成的保护,避免误删手动设置的规则
const PROTECTION_MARK = "AUTO_LOCK_GENERATED_BY_SCRIPT";

/**
 * 表格打开时自动执行:清除历史自动保护,开放编辑权限,生成自定义操作菜单
 */
function onOpen() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const targetSheet = ss.getSheetByName(TARGET_SHEET_NAME);
  if (!targetSheet) return;

  // 清理所有历史自动生成的保护
  const allProtections = targetSheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  allProtections.forEach(protection => {
    if (protection.getDescription() === PROTECTION_MARK) {
      protection.remove();
    }
  });

  // 添加自定义快捷菜单
  const ui = SpreadsheetApp.getUi();
  ui.createMenu("数据锁定工具")
    .addItem("立即锁定所有存量数据", "lockExistingData")
    .addToUi();
}

/**
 * 锁定当前工作表截至最后一行的存量数据,仅所有者可编辑
 */
function lockExistingData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const targetSheet = ss.getSheetByName(TARGET_SHEET_NAME);
  if (!targetSheet) return;

  const lastRow = targetSheet.getLastRow();
  const lastCol = targetSheet.getLastColumn();
  // 无有效数据时不生成空保护
  if (lastRow < 1 || lastCol < 1) return;

  // 先清理旧的自动保护
  const oldProtections = targetSheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  oldProtections.forEach(protection => {
    if (protection.getDescription() === PROTECTION_MARK) {
      protection.remove();
    }
  });

  // 生成新的保护范围
  const lockRange = targetSheet.getRange(1, 1, lastRow, lastCol);
  const newProtection = lockRange.protect().setDescription(PROTECTION_MARK);

  // 权限配置:仅保留所有者编辑权
  const ownerEmail = ss.getOwner().getEmail();
  const editorList = newProtection.getEditors().map(editor => editor.getEmail());
  newProtection.removeEditors(editorList);
  if (newProtection.canDomainEdit()) {
    newProtection.setDomainEdit(false);
  }
  newProtection.addEditor(ownerEmail);
}
配置步骤
  • 打开目标Google Sheets,点击顶部「扩展程序」→「Apps 脚本」进入脚本编辑器,删除默认的空函数,把上面的代码粘贴进去。
  • 修改代码开头的TARGET_SHEET_NAME变量值为你需要应用锁定逻辑的工作表名称,点击顶部保存按钮给项目命名。
  • 点击脚本编辑器左侧栏的时钟图标(触发器菜单),选择「添加触发器」,按以下参数配置:
    • 选择要运行的函数:lockExistingData
    • 选择部署版本:Head
    • 选择事件源:时间驱动
    • 选择时间类型:分钟计时器
    • 选择时间间隔:每5分钟
    • 点击保存,按照弹窗提示完成脚本授权即可。
  • 配置完成后,打开表格时会自动生成「数据锁定工具」自定义菜单,编辑完内容如果不想等5分钟自动锁定,直接点菜单里的「立即锁定所有存量数据」就能立刻完成锁定;下次打开表格时会自动清除上一次的锁定,允许正常编辑。

注意:首次授权时会弹出「Google 未验证此应用」的提示,这是个人自有脚本的正常提示,点击「高级」→「转到对应项目」即可完成授权,脚本仅在你自己的表格内运行,不会向外传输任何表格数据。

内容的提问来源于stack exchange,提问作者Edyphant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:21:41