12

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

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

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

4

4 回答 4

18

好消息:这个解决方法是可能的!

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

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;
}
于 2016-10-30T13:24:05.300 回答
7

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

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

于 2012-09-06T16:13:52.743 回答
1

当我使用从触发器运行的脚本时,我遇到了 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");

于 2018-04-01T14:06:25.960 回答
0

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

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);
}
于 2020-01-13T16:16:47.607 回答