我正在尝试识别当前用户的名字,以记录谁编辑了这样的内容:
r.setComment("Edit at " + (new Date()) + " by " + Session.getActiveUser().getEmail());
但它不起作用 - 用户名是空字符串。 我哪里出错了?
答案 0 :(得分:11)
好消息:这种解决方法可行!
我使用了一些保护功能,揭示了文档的用户和所有者,并且我将其存储在属性中以获得更好的性能。玩得开心!
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;
}
答案 1 :(得分:5)
我想你将这段代码设置为在onEdit
函数(或编辑触发器)中执行。
如果您使用的是消费者帐户,Session.getActiveUser)().getEmail()
将返回空白。仅当脚本的作者和用户位于同一Google Apps域时,它才会返回电子邮件地址。
答案 2 :(得分:1)
当我使用从触发器运行的脚本时,我遇到了Wim den Herder解决方案的问题。任何非脚本所有者都无法编辑受保护的单元格。如果脚本是从按钮运行的,它工作正常。但是我需要定期运行脚本,所以这是我的解决方案:
当用户第一次使用工作表时,他/她应该单击按钮并运行它:
constructor(props) {
super(props);
this.state = {
activeFilters: '',
availableAttributes:[]
};
this.setActiveFilter = this.setActiveFilter.bind(this); // this will make setActiveFilter be called with scope of your component object.
}
componentDidMount() {
$.ajax('/activeFilters',{
success: (e) => {
this.setActiveFilter(e);
},
error:function(e){
alert(e);
}
});
}
这将用户输入保存到用户属性。可以使用以下代码随时回读:
var user = PropertiesService.getUserProperties()。getProperty(" ID");
答案 3 :(得分: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);
}
答案 4 :(得分:-2)
function onEdit(e) {
SpreadsheetApp.getUi().alert("User Email is " + e.user);
}