我正在尝试根据用户电子邮件创建Google工作表自定义菜单。 代码如下:
var AllowedReportRecipients = ["u1@gmail.com", "u2@gmail.com", "u3@gmail.com"];
var ReportRecipient = null;
function onOpen()
{
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('Custom');
menu.addItem('Edit', 'editHtm')
.addItem('History', 'historyHtm');
var usr = Session.getActiveUser().getEmail();
var isReportee = false;
for (var i=0;i<AllowedReportRecipients.length; i++)
if (AllowedReportRecipients[i] == usr)
{
ReportRecipient = usr;
isReportee = true;
}
if (isReportee)
menu.addItem('Request abc', 'sendABC');
menu.addToUi();
}
这是一个未发表的工作表脚本。正如其他人报告了对getActiveUser()的调用。当工作表的非所有者打开工作表时,getEmail()返回空白。但是,稍后执行的getActiveUser()。getEmail()调用将正确返回登录的用户电子邮件。例如,当在historyHtm中调用以响应“历史记录”菜单项时,单击它可以工作。为什么不同?如何正确加载菜单?
答案 0 :(得分:3)
onOpen()
函数是一个特殊的保留函数,是Google Apps脚本中内置的[Simple Trigger] [1]函数之一。这些功能在不需要用户授权的情况下运行,因此他们可以访问的系统功能存在限制。
对于您的情况,重要的限制是:
它们可能会也可能无法确定当前用户的身份,具体取决于[一组复杂的安全限制] [2]。 ref
对于拥有与开发者不在同一Google Apps域中的消费者帐户或帐户的用户,onOpen()
功能将无法获取运行该脚本的人员的电子邮件地址。
当你运行其他功能时,例如那些通过菜单调用的功能,它们会启动脚本的授权周期,之后他们可以做的不仅仅是简单的触发器。
这似乎不一致 - 但是是设计上的。
我认为你需要重新考虑你的用户界面 - 我还没能找到能够产生特权的解决方案。打开电子表格时菜单的一部分。