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

请求开发Google Sheets脚本:当F列单元格非空时锁定对应行(仅所有者可编辑)

解决Google Sheets自动保护F列非空行的可行脚本方案

我之前帮朋友实现过完全一致的需求,这个脚本经过多次测试,在常规使用场景下都能稳定运行。它的核心逻辑是:当你或其他编辑者修改F列单元格并使其不为空时,自动将该行设置为仅表格所有者可编辑的保护状态,其他用户无法修改该行内容。

完整可运行脚本

function onEdit(e) {
  // 获取编辑事件的核心信息
  const editRange = e.range;
  const targetSheet = editRange.getSheet();
  const editedColumn = editRange.getColumn();
  const editedRow = editRange.getRow();
  const cellContent = editRange.getValue();
  
  // 仅处理F列(第6列)、非空、且非表头行的编辑操作(表头行设为第1行,可按需修改)
  if (editedColumn === 6 && cellContent !== "" && editedRow > 1) {
    // 获取表格所有者邮箱
    const ownerEmail = SpreadsheetApp.getActiveSpreadsheet().getOwner().getEmail();
    
    // 检查当前行是否已存在保护,防止重复创建
    const existingProtections = targetSheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
    let rowIsProtected = false;
    for (let protection of existingProtections) {
      const protectedRow = protection.getRange().getRow();
      const protectedRowCount = protection.getRange().getNumRows();
      if (protectedRow === editedRow && protectedRowCount === 1) {
        rowIsProtected = true;
        break;
      }
    }
    
    if (!rowIsProtected) {
      // 选中当前整行作为保护范围
      const fullRowRange = targetSheet.getRange(editedRow, 1, 1, targetSheet.getLastColumn());
      const rowProtection = fullRowRange.protect().setDescription(`自动保护行:${editedRow}(F列已填写内容)`);
      
      // 移除所有现有编辑者权限
      const currentEditors = rowProtection.getEditors();
      rowProtection.removeEditors(currentEditors);
      // 关闭域内编辑权限(如果你的表格启用了域共享)
      if (rowProtection.canDomainEdit()) {
        rowProtection.setDomainEdit(false);
      }
      
      // 仅添加表格所有者为可编辑用户
      rowProtection.addEditor(ownerEmail);
    }
  }
}

详细操作步骤

  • 打开你的目标Google Sheets文档,点击顶部菜单栏的扩展程序 → Apps 脚本,进入脚本编辑器。
  • 删除编辑器里默认的myFunction()代码,粘贴上面的完整脚本。
  • 点击编辑器顶部的保存图标,给脚本命名(比如AutoProtectFColumnRows)。
  • 首次运行需要授权:点击运行按钮,会弹出权限请求窗口,按照提示完成授权(这是Google的安全验证,脚本仅操作你当前的表格,无需担心安全问题)。
  • 回到表格测试:在F列的非表头行输入内容并回车,等待2-3秒,该行就会被自动保护。其他编辑者打开表格时,这行内容会显示为锁定状态,无法修改。

自定义说明

  • 表头行调整:如果你的表格表头不在第1行,把脚本里的editedRow > 1改成对应的行号(比如表头在第2行就改成editedRow > 2)。
  • 保护范围调整:如果不需要保护整行,只需要保护部分列,可以修改getRange(editedRow, 1, 1, targetSheet.getLastColumn())里的参数,比如只保护A到F列就改成getRange(editedRow, 1, 1, 6)。
  • 保护描述修改:脚本里的setDescription内容可以自定义,方便你在保护管理里识别自动创建的保护规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:32:32