【问题标题】:Determine current user in Apps Script在 Apps 脚本中确定当前用户
【发布时间】:2012-09-06 13:04:08
【问题描述】:

我正在尝试识别当前用户的姓名以记录谁编辑了这样的内容:

  r.setComment("Edit at " + (new Date()) + " by " + Session.getActiveUser().getEmail());

但它不起作用 - 用户名是一个空字符串。 我哪里做错了?

【问题讨论】:

标签: google-apps-script google-sheets


【解决方案1】:

好消息:可以使用此解决方法!

我正在使用一些保护功能来显示文档的用户和所有者,并将其存储在属性中以获得更好的性能。玩得开心!

function onEdit(e) {
  SpreadsheetApp.getUi().alert("User Email is " + getUserEmail());
}

function getUserEmail() {
  var userEmail = PropertiesService.getUserProperties().getProperty("userEmail");
  if(!userEmail) {
    var protection = SpreadsheetApp.getActive().getRange("A1").protect();
    // tric: the owner and user can not be removed
    protection.removeEditors(protection.getEditors());
    var editors = protection.getEditors();
    if(editors.length === 2) {
      var owner = SpreadsheetApp.getActive().getOwner();
      editors.splice(editors.indexOf(owner),1); // remove owner, take the user
    }
    userEmail = editors[0];
    protection.remove();
    // saving for better performance next run
    PropertiesService.getUserProperties().setProperty("userEmail",userEmail);
  }
  return userEmail;
}

【讨论】:

【解决方案2】:

我想您已将这段代码设置为在 onEdit 函数(或编辑触发器)内执行。

如果您使用的是消费者帐户,Session.getActiveUser().getEmail() 将返回空白。只有当脚本的作者和用户都在同一个 Google Apps 域中时,它才会返回电子邮件地址。

【讨论】:

  • 如果安全策略不允许访问用户的身份,User.getEmail() 返回一个空白字符串。电子邮件地址可用的情况各不相同:例如,用户的电子邮件地址在任何允许脚本在未经用户授权的情况下运行的上下文中都不可用,例如简单的 onOpen(e) 或 onEdit(e) 触发器、 Google 表格中的自定义函数,或部署为“以我身份执行”的网络应用程序(即由开发人员而非用户授权)。 developers.google.com/apps-script/reference/base/session
【解决方案3】:

当我使用从触发器运行的脚本时,我在使用 Wim den Herder 的解决方案时遇到了问题。任何非脚本所有者都无法编辑受保护的单元格。如果脚本是从按钮运行的,它工作得很好。但是我需要定期运行脚本,所以这是我的解决方案:

当用户第一次使用工作表时,他/她应该单击一个按钮并运行:

function identifyUser(){
   var input = Browser.inputBox('Enter User Id which will be used to save user to events (run once)');
  PropertiesService.getUserProperties().setProperty("ID", input);
}

这会将用户的输入保存到用户属性中。以后可以随时使用此代码回读:

var user = PropertiesService.getUserProperties().getProperty("ID");

【讨论】:

    【解决方案4】:

    在此代码中,您可以使用单元格进行输入。不需要授权脚本。

    function onEdit(e){
      checkUsername(e);
    }
    
    function checkUsername(e){
      var sheet = e.source.getActiveSheet();
      var sheetToCheck = 'Your profile';
      var sheetName = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetToCheck);
      var CellInputUsername = 'B4';
      var ActiveCell = SpreadsheetApp.getActive().getActiveRange().getA1Notation();
    
      if (sheet.getName() !== sheetToCheck || ActiveCell !== CellInputUsername){return;}
    
      var cellInput = sheetName.getRange(CellInputUsername).getValue();
      PropertiesService.getUserProperties().setProperty("Name", cellInput);
    
      // Make cell empty again for new user
      sheetName.getRange(CellInputUsername).setValue("");
    
      var Username = PropertiesService.getUserProperties().getProperty("Name");      
      SpreadsheetApp.getUi().alert("Hello " + Username);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 2011-04-12
      • 2019-07-27
      • 2016-12-16
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多