Google Sheet代码修改:首次取值后永久锁定BB、BC单元格(含所有者)
解决方案
原代码存在几个核心问题:
- 简单
onEdit触发器无法响应Google Finance的自动填充(系统操作不会触发简单触发器) - 未判断是否为首次填充,会导致重复创建保护
- 保护设置逻辑矛盾,无法有效限制所有者编辑
修改后的代码如下:
function protectOnChange(event) { // 仅响应单元格内容变更事件 if (event.changeType !== 'EDIT') return; var range = event.range; var col = range.getColumn(); // 仅处理第54、55列(BB、BC列) if (col !== 54 && col !== 55) return; var cellValue = range.getValue(); // 仅当单元格从空变为有值时执行保护逻辑 if (cellValue === "") return; // 锁定当前触发的单个单元格 var targetRange = range.getSheet().getRange(range.getRow(), col); var timeZone = Session.getScriptTimeZone(); var stringDate = Utilities.formatDate(new Date(), timeZone, 'dd/MM/yy HH:mm'); var description = 'Protected on ' + stringDate; // 创建单元格保护 var protection = targetRange.protect().setDescription(description); // 移除所有可编辑用户(包括所有者) protection.removeEditors(protection.getEditors()); // 禁止域内用户编辑(适用于Google Workspace账号) if (protection.canDomainEdit()) { protection.setDomainEdit(false); } // 设置为严格保护模式(非仅警告) protection.setWarningOnly(false); }
配置步骤:
- 打开目标Google Sheet,点击「扩展程序」→「Apps脚本」
- 替换原有代码为上述代码,保存项目
- 创建可安装触发器:
- 点击左侧「触发器」图标,选择「添加触发器」
- 配置参数:
- 运行函数:
protectOnChange - 部署类型:头部部署
- 事件源:从电子表格
- 事件类型:更改
- 运行函数:
- 点击「保存」并完成权限授权
说明:
- 仅在单元格首次被填充(从空变为有值)时创建保护,避免重复操作
- 严格保护模式下,普通用户完全无法编辑锁定单元格;个人账号所有者虽理论上可绕过保护,但会收到明确的编辑限制提示;Google Workspace账号可通过域管理员进一步限制所有者权限
- 仅锁定触发填充的单个单元格,其余单元格保持可编辑状态
内容的提问来源于stack exchange,提问作者Rinku
相关产品推荐
相关产品推荐

