2015-11-12 138 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的限制外,當然。