如何用Apps Script在数据录入后保护Google Spreadsheet工作表
Google Spreadsheet 批量锁定已录入数据 Apps Script 实现方案
你可以直接复用下面的脚本,等所有用户完成录入后一键执行,就能自动给所有工作表的已填充区域加编辑保护,防止误改或随意篡改。
核心逻辑
脚本会遍历电子表格下的所有工作表,自动识别每张表已填充数据的有效范围,给范围添加严格编辑保护,默认仅表格所有者和脚本运行者保留编辑权限,其他拥有表格编辑权的用户将无法修改锁定区域的内容。支持绑定自定义菜单,不用每次打开脚本编辑器操作。完整脚本代码
// 打开表格时自动生成自定义操作菜单 function onOpen() { const ui = SpreadsheetApp.getUi(); ui.createMenu('数据保护工具') .addItem('一键锁定所有已录入数据', 'protectAllFilledRanges') .addToUi(); } // 批量保护所有工作表已填充区域主函数 function protectAllFilledRanges() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const allSheets = ss.getSheets(); const currentUser = Session.getEffectiveUser().getEmail(); allSheets.forEach(sheet => { // 获取当前工作表已使用的最大行列数,跳过空工作表 const lastRow = sheet.getLastRow(); const lastCol = sheet.getLastColumn(); if (lastRow === 0 || lastCol === 0) return; // 选中已填充的完整数据区域 const filledRange = sheet.getRange(1, 1, lastRow, lastCol); // 创建保护规则 const protection = filledRange.protect() .setDescription(`录入完成自动保护_${new Date().toLocaleString()}`) .setWarningOnly(false); // 改为true则仅弹修改警告,不强制拦截 // 移除其他用户的编辑权限,仅保留当前操作用户和表格所有者权限 const editors = protection.getEditors(); editors.forEach(editor => { if (editor.getEmail() !== currentUser) { protection.removeEditor(editor); } }); protection.addEditor(ss.getOwner()); }); SpreadsheetApp.getUi().alert('操作完成:所有已录入数据已锁定,其他编辑用户无法修改'); }
使用步骤
- 打开目标谷歌电子表格,点击顶部菜单栏「扩展程序」>「Apps 脚本」打开脚本编辑器
- 清空编辑器里默认的空白代码,把上面的完整代码粘贴进去,点击保存按钮,给脚本项目随便命名即可
- 回到谷歌表格页面刷新,等待5秒左右顶部菜单栏会出现名为「数据保护工具」的新菜单
- 等所有用户完成数据录入后,点击菜单内的「一键锁定所有已录入数据」,第一次运行会弹出授权提示,点击「高级」>「转到(你的脚本项目名)」走完授权流程即可,脚本执行完成后会弹出成功提示。
自定义调整说明
- 如果不需要强制拦截修改,只希望其他用户编辑时弹出风险警告,把代码中
setWarningOnly(false)的参数改为true即可 - 如果需要给特定用户保留锁定区域的编辑权限,在权限设置代码块里添加一行
protection.addEditor('指定用户的邮箱地址')即可 - 如果不需要自定义菜单,直接删掉
onOpen函数部分,每次需要锁定数据时,在脚本编辑器顶部选中protectAllFilledRanges函数点击运行即可
- 如果不需要强制拦截修改,只希望其他用户编辑时弹出风险警告,把代码中
注意:脚本仅会锁定执行时刻已经填充了内容的单元格区域,如果锁定后你又在空白区域新增了内容,需要重新运行一次脚本,才能把新录入的内容也纳入保护范围。
内容的提问来源于stack exchange,提问作者Mina Foe
相关产品推荐
相关产品推荐

