4

我爲Google Spreadsheets創建了一個腳本,此腳本只是添加了一個新菜單項,如Custom Menu Items in a Spreadsheet所述。然後,我將這個腳本部署爲一個Web App,我希望所有安裝該應用程序的用戶都能夠看到新的菜單項。而且我被困在這一點上。使用Google Web App擴展Google Spreadsheets UI

據我所知,當您將腳本部署爲Web應用程序時,onOpen函數會失去它的含義。因此,在doGet中,我爲onOpen事件創建自定義觸發器,將myOnOpen處理程序附加到它並在myOnOpen中添加一個菜單項,但該項不顯示。

這裏是我的代碼:

function doGet() { 
    var newSheet = SpreadsheetApp.create("new sheet"); 
    var newId = newSheet.getId(); 
    ScriptProperties.setProperty('newId', newId); 

    ScriptApp.newTrigger("myOnOpen") 
     .forSpreadsheet(newId) 
     .onOpen() 
     .create(); 
}; 

function myOnOpen() { 
    var newId = ScriptProperties.getProperty('newId'); 
    var sheet = SpreadsheetApp.openById(newId); 

    var entries = [ { name : "Show bingo", functionName : "Bingo" } ]; 
    sheet.addMenu("My Menu", entries); 
}; 

function Bingo() { 
    Browser.msgBox("Bingo!"); 
}; 

所以,當誰安裝的應用程序在用戶打開「新表」的電子表格,他沒有看到「我的菜單」。我在這裏做錯了什麼?爲什麼菜單項不顯示?在這一天結束時,我想創建一個Web應用程序,該應用程序通過附加菜單和對話框擴展Google Spreadsheets UI。

歡迎任何建議。謝謝!

+0

我無法弄清Bingo函數在新電子表格的腳本中如何結束......我也不能用於'myonopen'函數......你怎麼想象這個過程?我的觀點是,這是不可能的......爲什麼不創建一個模板,腳本已經包含在內,然後創建觸發器?你能澄清一下嗎?我真的好奇...... –

+0

@Sergeinsas當用戶執行應用程序時,會在他的GDrive中創建自定義觸發器。該觸發器附加到用戶的GDrive中的特定電子表格。每次用戶打開此電子表格時,都會調用myOnOpen。它的工作原理,我創建測試帳戶,安裝我的應用程序,打開「新工作表」,myOnOpen被調用。我甚至可以從myOnOpen函數(例如'sheet.setColumnWidth(1,200)')中修改電子表格,但是我不能在那裏創建自定義菜單。模板不適合我,我希望用戶上傳他們的.xls文件,並且我想添加用於編輯這些文件的自定義用戶界面。 – xman85

+0

當用戶打開SS時,您是如何測試myonOpen確實運行的? Bingo怎麼樣?它沒有與電子表格的鏈接...這不符合「腳本和容器」的定義。 –

回答

0

將腳本部署爲Web應用程序時,Web應用程序的用戶只會看到您從doGet函數「返回」的內容。您可以使用UiAppHtmlService創建內容,並返回此內容以在瀏覽器中呈現。您的新菜單項會附加到電子表格中,因此只能在用戶轉到電子表格本身時才能顯示(激活onOpen觸發器等)。

+0

在我的情況下,發生以下情況:用戶安裝應用程序,之後,用戶打開新創建的「新工作表」在他的GDrive,myOnOpen函數運行,但菜單不會被添加。 – xman85