Session.getActiveUser()。getEmail()结果不一致

时间:2015-11-12 05:01:51

标签: google-apps-script google-sheets

我正在尝试根据用户电子邮件创建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中调用以响应“历史记录”菜单项时,单击它可以工作。为什么不同?如何正确加载菜单?

1 个答案:

答案 0 :(得分:3)

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

对于您的情况,重要的限制是:

  

它们可能会也可能无法确定当前用户的身份,具体取决于[一组复杂的安全限制] [2]。     ref

对于拥有与开发者不在同一Google Apps域中的消费者帐户或帐户的用户,onOpen()功能将无法获取运行该脚本的人员的电子邮件地址。

当你运行其他功能时,例如那些通过菜单调用的功能,它们会启动脚本的授权周期,之后他们可以做的不仅仅是简单的触发器。

这似乎不一致 - 但是是设计上的。

我认为你需要重新考虑你的用户界面 - 我还没能找到能够产生特权的解决方案。打开电子表格时菜单的一部分。

  • 已安装的 onOpen触发器将具有比简单触发器更强大的功能,但将在开发人员的授权下运行,因此它无法帮助您解决问题,因为它会提供您的电子邮件,而非活跃用户
  • 在onOpen中设置定时触发器以更新菜单似乎很有希望...当然,除了定时触发器功能无法访问电子表格UI的限制外。