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

需求:带onEdit脚本的Google Sheets活动追踪器,限制时间戳编辑权限

Google Sheets 活动追踪器实现方案

针对你需要的活动追踪器需求,以下是通过Apps Script实现的完整方案,解决非管理员时间戳锁定、自动时长计算的问题:

实现逻辑

  • 利用onEdit触发器监控单元格编辑,区分管理员与普通用户权限
  • 普通用户仅能为空白的「Start/End」列插入一次时间戳(支持Ctrl+Shift+;快捷键),无法修改已有值
  • 管理员可自由编辑所有时间戳
  • 「Durations」列自动根据Start/End时间计算时长,超过60分钟显示HH:MM格式,不足则显示分钟数

步骤说明

  1. 表格结构准备
    创建工作表(推荐命名为「活动追踪」),设置表头:

    • A列:活动名称
    • B列:Start(时间戳列)
    • C列:End(时间戳列)
    • D列:Durations(时长计算列)
  2. 添加脚本

    • 点击菜单栏「扩展程序」→「Apps Script」打开脚本编辑器
    • 删除默认代码,粘贴以下脚本(替换管理员邮箱):
function onEdit(e) {
  const sheet = e.source.getActiveSheet();
  // 仅处理指定工作表,可修改为你的工作表名称
  if (sheet.getName() !== "活动追踪") return;
  
  const range = e.range;
  const col = range.getColumn();
  const row = range.getRow();
  // 跳过表头行(假设表头在第1行)
  if (row === 1) return;
  
  const userEmail = Session.getActiveUser().getEmail();
  const ADMIN_EMAIL = "admin@yourdomain.com"; // 替换为管理员邮箱
  const isAdmin = userEmail === ADMIN_EMAIL;
  
  // 监听Start列(B列,列号2)和End列(C列,列号3)的编辑
  if (col === 2 || col === 3) {
    const oldValue = e.oldValue;
    const newValue = e.value;
    
    // 普通用户权限控制
    if (!isAdmin) {
      // 已有值的单元格禁止修改
      if (oldValue !== undefined && oldValue !== "") {
        range.setValue(oldValue);
        SpreadsheetApp.getUi().alert("非管理员无法修改已存在的时间戳");
        return;
      }
      // 验证输入为有效时间(确保是时间戳格式)
      const date = new Date(newValue);
      if (isNaN(date.getTime())) {
        range.setValue(oldValue);
        SpreadsheetApp.getUi().alert("仅允许插入时间戳,请使用Ctrl+Shift+;快捷键");
        return;
      }
    }
    // 自动计算时长
    calculateDuration(sheet, row);
  }
}

// 计算并设置时长
function calculateDuration(sheet, row) {
  const startCell = sheet.getRange(row, 2);
  const endCell = sheet.getRange(row, 3);
  const durationCell = sheet.getRange(row, 4);
  
  const start = startCell.getValue();
  const end = endCell.getValue();
  
  if (start && end) {
    const diffMs = end.getTime() - start.getTime();
    const diffMins = Math.floor(diffMs / (1000 * 60));
    let durationStr;
    if (diffMins >= 60) {
      const hours = Math.floor(diffMins / 60);
      const mins = diffMins % 60;
      durationStr = `${hours}:${mins.toString().padStart(2, '0')}`;
    } else {
      durationStr = `${diffMins}分钟`;
    }
    durationCell.setValue(durationStr);
  } else {
    durationCell.clearContent();
  }
}
  1. 保存并测试
    • 点击脚本编辑器的「保存」按钮,命名为ActivityTracker
    • 切换回表格测试:
      • 普通用户:在B/C列空白单元格用Ctrl+Shift+;插入时间,尝试修改已输入的时间会触发警告并撤销编辑
      • 管理员用户:可自由编辑所有时间戳
      • 修改Start/End时间后,D列会自动更新时长

自定义调整

  • 若工作表名称不是「活动追踪」,修改脚本中sheet.getName() !== "活动追踪"的字符串
  • 时长格式可按需调整:比如要纯数字分钟,将durationStr = ${diffMins}分钟``改为durationStr = diffMins
  • 如需支持多个管理员,可将isAdmin判断改为数组匹配:const ADMINS = ["admin1@xxx.com", "admin2@xxx.com"]; const isAdmin = ADMINS.includes(userEmail);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:05:24