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