2015-11-12 106 views
1

我试图根据用户电子邮件创建一个Google表单自定义菜单。 代码如下:Session.getActiveUser().getEmail()结果不一致

var AllowedReportRecipients = ["[email protected]", "[email protected]", "[email protected]"]; 
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中响应“历史”菜单项调用时,点击它的工作。为什么区别?我如何正确加载我的菜单?

回答

1

onOpen()函数是一种特殊的保留函数,它是Google Apps脚本中内置的[Simple Trigger] [1]函数之一。这些功能在不需要用户授权的情况下运行,因此它们可以访问的系统的功能有限制。

对于你的情况,最重要的限制是这样的:

他们可能会或可能不能够确定当前用户的身份,这取决于[一整套复杂的安全限制] [2]。 ref

对于消费者账户或不在同谷歌Apps域名为开发者帐户的用户,onOpen()功能将无法获得运行脚本的人的电子邮件地址。

当您运行其他函数(例如通过菜单调用的函数)时,它们启动脚本的授权周期,之后它们能够做的不仅仅是简单的触发器。

这似乎不一致 - 但是通过设计。

我认为你需要重新考虑你的用户界面 - 我一直没能找到解决办法,打开电子表格时会产生菜单的“特权”部分。

  • 安装的OnOpen触发器将具有比简单的触发更大的能力,但开发者的权限下运行,所以它不会帮助你的情况,因为这将拿出你的电子邮件,而不是活跃用户的。
  • 在onOpen中设置定时触发器以更新菜单看起来很有希望......除了定时触发器功能无法访问电子表格UI的限制外,当然。