如何编写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
相关产品推荐
相关产品推荐

