function onOpen(e) {
// Only creates menu item, and nothing else
FormApp.getUi()
.createMenu('My Menu')
.addItem('My Menu item','myFunction')
.addToUi();
}
function myFunction() {
// Functionality here; may include code that requires authorization
}
function onOpen() {
var userInterface = createUi();
var ui = formApp.getUi();
ui.showSidebar(userInterface)
}
function createUi(){
var app = UiApp.createApplication().setTitle('test sidebar');
var panel = app.createVerticalPanel();
panel.add(app.createLabel('This is a SideBar'));
return app.add(panel);
}
2 回答
在用户授权之前,可以通过onOpen()为Form创建菜单项 . 例如,以下内容将创建一个包含单个菜单项的菜单:
要记住的是,onOpen应仅用于创建菜单 - 它不应包含任何需要授权的代码 . 原因是Apps脚本允许onOpen()在未经授权的情况下运行,但如果其中的任何内容需要授权,则会完全阻止其执行 . 这是一个用户安全机制 - onOpen()在用户与Form交互之前运行,并且在不首先获得用户许可的情况下永远不会自动运行 . 因此,如果脚本未经授权,则Apps脚本将仅允许执行某些任务(如菜单创建) .
出于同样的原因,重要的是不要使用访问Apps脚本服务的全局变量 . 在读取脚本文件时读取和处理全局变量,从而在要求用户授权之前执行 . 如果使用全局变量,最佳做法是将它们限制为简单常量 .
您可以阅读有关Apps Script Authorization Lifecycle的更多信息 . 本文档重点介绍Apps脚本加载项的授权,但其中大部分内容与常规Apps脚本脚本相关 .
另一个答案是关于授权的正确,onOpen具有有限的功能,因为它在没有用户明确许可的情况下运行 . 您也可以使用它来创建侧边栏(不仅仅是菜单项)
示例如下:
如上所述(但我坚持;-)如果您使用全局服务调用时要小心,因为在调用每个函数时执行这些调用(包括onOpen)并且可能会阻止脚本按预期工作 .