You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Google Sheets编辑事件中捕获非创建者用户邮箱?

解决Google Sheets编辑事件中获取操作用户邮箱的问题

核心原因

简单触发器(onEdit)运行在操作用户的上下文,但如果用户未授权脚本,Session.getActiveUser().getEmail()会返回空值;普通可安装触发器若未正确利用事件对象的用户属性,也无法获取邮箱。只有以表格管理员身份创建的可安装触发器,才能通过事件对象拿到所有操作用户的邮箱。

解决方案步骤

1. 替换触发器类型

删除原有简单onEdit触发器,创建可安装的onEdit触发器

  • 打开表格的脚本编辑器(工具 → 脚本编辑器)
  • 点击左侧时钟图标进入触发器管理页面
  • 点击「添加触发器」,配置:
    • 运行函数:handleEditEvent
    • 部署来源:从表格
    • 事件类型:当编辑时
  • 按提示完成授权(必须用表格所有者/管理员账号操作)

2. 修正代码逻辑

用事件对象的e.user.getEmail()替代Session.getActiveUser().getEmail(),修改后的完整代码如下:

var CONFIG = {
  SPREADSHEET_URL: '*/edit', // 替换为实际表格URL
  OWNER_EMAIL: ['xxxxx@gmail.com', 'yyyy@pirs.ooo'],
  EDITORS_TO_REMOVE: {"Агама":['zzzz@gmail.com'],"Юнифрост":['uuuu@gmail.com']}
};

function handleEditEvent(e) {
  if (!e || !e.range) {
    Logger.log('handleEditEvent 未接收到有效事件');
    return;
  }
  
  // 从事件对象获取操作用户邮箱
  const userEmail = e.user ? e.user.getEmail() : '';
  if (!userEmail) {
    Logger.log('无法获取用户邮箱');
    return;
  }
  
  Logger.log("当前用户: " + userEmail);
  processGateEdit(e, userEmail);
}

// 提取原编辑逻辑为独立函数
function processGateEdit(e, userEmail) {
  const sheet = e.source.getActiveSheet();
  const row = e.range.rowStart;
  const col = e.range.columnStart;

  const gateRanges = [
    { clientCol: 3, gateCol: 4, windowCol: 5, name: 'Ворота 1' }, // C-E
    { clientCol: 6, gateCol: 7, windowCol: 8, name: 'Ворота 2' }, // F-H
    { clientCol: 9, gateCol: 10, windowCol: 11, name: 'Ворота 3' } // I-K
  ];

  let processed = false;
  for (const range of gateRanges) {
    if ([range.clientCol, range.gateCol, range.windowCol].includes(col)) {
      handleGateEdit(sheet, row, range, userEmail, e);
      processed = true;
      break;
    }
  }

  if (!processed) return;
}

// 权限校验与编辑处理逻辑
function handleGateEdit(sheet, row, range, userEmail, e) {
  // 管理员直接放行
  if (CONFIG.OWNER_EMAIL.includes(userEmail)) {
    return;
  }
  
  // 校验用户是否有权限编辑当前时段
  let allowed = false;
  const clientName = sheet.getRange(row, range.clientCol).getValue();
  
  // 检查用户是否属于当前客户公司,且编辑的是预留/空时段
  if (CONFIG.EDITORS_TO_REMOVE[clientName] && CONFIG.EDITORS_TO_REMOVE[clientName].includes(userEmail)) {
    // 这里补充你的业务逻辑:比如检查时段是否为空或属于该公司
    allowed = true;
  }
  
  // 无权限则撤销编辑并提示
  if (!allowed) {
    e.range.setValue(e.oldValue);
    SpreadsheetApp.getUi().alert('你没有权限编辑该时段');
  }
}

3. 关键注意点

  • 触发器必须由表格管理员创建,否则无法获取e.user信息
  • 授权时必须允许脚本访问用户电子邮箱地址
  • 若用户未登录Google账号编辑表格,仍无法获取邮箱(这种情况需限制匿名编辑)

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

火山引擎 最新活动