我正在尝试识别当前用户的姓名,以记录谁编辑了这样的内容:
r.setComment("Edit at " + (new Date()) + " by " + Session.getActiveUser().getEmail());
但它不起作用 - 用户名是一个空字符串。我哪里做错了?
我正在尝试识别当前用户的姓名,以记录谁编辑了这样的内容:
r.setComment("Edit at " + (new Date()) + " by " + Session.getActiveUser().getEmail());
但它不起作用 - 用户名是一个空字符串。我哪里做错了?
好消息:这个解决方法是可能的!
我正在使用一些保护功能来显示文档的用户和所有者,并将其存储在属性中以获得更好的性能。玩得开心!
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;
}
我想您将这段代码设置为在onEdit
函数(或编辑触发器)内执行。
如果您使用的是消费者帐户,Session.getActiveUser().getEmail()
则将返回空白。只有当脚本的作者和用户都在同一个 Google Apps 域中时,它才会返回电子邮件地址。
当我使用从触发器运行的脚本时,我遇到了 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");
在此代码中,您可以使用单元格进行输入。不需要授权脚本。
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);
}