You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Google Sheets中根据同行指定时间自动保护单元格?

嗨,我来帮你搞定这个Google Sheets的自动保护需求!完全不用怕不懂代码,跟着我一步步来就行~

Google Sheets 自动定时保护单元格方案

针对你需要在时间到达A列对应值时,自动锁定对应行B、C列(仅允许指定用户编辑)的需求,我们可以用Google Apps Script实现,下面是详细操作步骤:

步骤1:打开脚本编辑器

打开你的目标Google表格,点击顶部菜单栏的 工具脚本编辑器,这会弹出一个新的Google Apps Script编辑页面。

步骤2:替换默认代码

把编辑器里默认的function myFunction()代码全部删掉,粘贴下面的脚本:

function protectRowsWhenTimeReached() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const dataRange = sheet.getDataRange();
  const values = dataRange.getValues();
  const now = new Date();
  
  // 👉 这里替换成允许编辑的用户邮箱,多个用逗号分隔
  const allowedEditors = ['your-email@example.com', '指定用户邮箱@example.com'];
  
  // 从第2行开始遍历(跳过表头行)
  for (let i = 1; i < values.length; i++) {
    // 合并A列日期和B列时间成完整时间字符串
    const rowDateTimeStr = values[i][0] + ' ' + values[i][1];
    // 解析挪威格式的日期时间(dd.mm.yyyy hh:mm)
    const [datePart, timePart] = rowDateTimeStr.split(' ');
    const [day, month, year] = datePart.split('.');
    const [hour, minute] = timePart.split(':');
    const rowDateTime = new Date(year, month - 1, day, hour, minute);
    
    // 检查当前时间是否已超过该行时间,且该行未被保护
    if (now >= rowDateTime) {
      const protectRange = sheet.getRange(i + 1, 2, 1, 2); // 锁定第i+1行的B、C列(2列开始,1行2列)
      const existingProtections = protectRange.getProtections(SpreadsheetApp.ProtectionType.RANGE);
      
      // 如果还没设置保护,就创建新保护规则
      if (existingProtections.length === 0) {
        const protection = protectRange.protect();
        // 移除所有默认协作用户的编辑权限
        const currentEditors = protection.getEditors();
        protection.removeEditors(currentEditors);
        // 添加你指定的允许编辑用户
        if (allowedEditors.length > 0) {
          protection.addEditors(allowedEditors);
        }
        // 设置保护备注,方便识别
        protection.setDescription(`自动保护:已超过时间 ${rowDateTimeStr}`);
      }
    }
  }
}

// 创建定时触发器,自动定期检查时间
function createTimeDrivenTrigger() {
  ScriptApp.newTrigger('protectRowsWhenTimeReached')
      .timeBased()
      .everyHours(1) // 每小时检查一次,可改成everyMinutes(15)每15分钟,按需调整
      .create();
}

步骤3:配置允许编辑的用户

在脚本里找到const allowedEditors = ['your-email@example.com', '指定用户邮箱@example.com'];这一行,把里面的邮箱替换成你自己和需要授权的用户邮箱,多个邮箱用逗号分隔即可。

步骤4:运行脚本并完成授权

  1. 先点击编辑器顶部的 运行 按钮,第一次运行会弹出授权提示,点击 授权访问,按照页面提示完成权限授予(这是安全的,脚本只会访问你的目标表格)。
  2. 先运行protectRowsWhenTimeReached函数,测试一下是否能正确锁定已经过了时间的行。
  3. 再运行createTimeDrivenTrigger函数,创建定时触发器——这样脚本就会自动每隔一段时间检查一次,到点就自动锁定对应单元格啦!

步骤5:验证效果

  • 找一行已经超过A列时间的行,查看B、C列是否显示“受保护”,其他协作用户打开表格时,这两个单元格会无法编辑,只有你指定的用户能修改。
  • 可以临时把某行A列的时间改成当前时间之后10分钟左右,等时间到了,看看脚本是否自动锁定了该行的B、C列。

一些注意事项

  • 日期格式兼容:脚本已经适配了挪威的dd.mm.yyyy日期格式,只要A列日期和B列时间填写正确(比如01.01.202114:00),就能正常解析。
  • 触发器频率:如果需要更及时的检查,可以把everyHours(1)改成everyMinutes(15)(每15分钟检查一次),但不要设置太频繁,避免触发Google的脚本执行限制。
  • 后续修改权限:如果需要调整允许编辑的用户,直接修改脚本里的allowedEditors数组,重新运行protectRowsWhenTimeReached函数即可更新所有保护规则。

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

火山引擎 最新活动