Google apps script 如何从应用程序脚本库中调用CreateMenu()?
我正在应用程序脚本中构建一个库,并希望它能够自我维持。本质上,如果有人想在他们的Google工作表中使用这个库,他们只需要在他们的工作表脚本中输入以下代码Google apps script 如何从应用程序脚本库中调用CreateMenu()?,google-apps-script,google-apps-script-addon,google-apps-script-editor,Google Apps Script,Google Apps Script Addon,Google Apps Script Editor,我正在应用程序脚本中构建一个库,并希望它能够自我维持。本质上,如果有人想在他们的Google工作表中使用这个库,他们只需要在他们的工作表脚本中输入以下代码 function onOpen(){ myLib.initialize(); } 这将根据需要设置表格。我在这里做的一件事就是在工作表中添加一个菜单项。因此,在我的库代码中,我将有如下内容: function initialize(){ var ui = SpreadsheetApp.getUi(); ui.createMenu
function onOpen(){
myLib.initialize();
}
这将根据需要设置表格。我在这里做的一件事就是在工作表中添加一个菜单项。因此,在我的库代码中,我将有如下内容:
function initialize(){
var ui = SpreadsheetApp.getUi();
ui.createMenu('Custom Menu')
.addItem('First item', 'someCallback')
.addToUi();
}
这种方法的问题是,当单击菜单项时,找不到“someCallback”函数。这是有意义的,因为它位于一个单独的库中。应该使用如下点符号调用它:myLib.someCallback
是否有某种方法可以在运行时获取库标识符,以便创建创建菜单所需的字符串?
我可以做一些不是我第一选择的事情,例如:
- 将“myLib”字符串传递给initialize函数
- 直接在
函数中键入“myLib”,但我认为这不是一种好的做法,如果最终用户将标识符从myLib更改为其他内容会怎么样addItem()
this
关键字和eval()测试了一些东西
函数,以便动态获取重新定义的myLib
标识符,或直接在initialize
函数中调用someCallback
,但甚至将回调函数嵌入initialize
中:
function initialize(name) {
console.log(Object.keys(name));
}
函数初始化(){
var cb=函数someCallback(){
//做事
};
var ui=SpreadsheetApp.getUi();
ui.createMenu(“自定义菜单”)
.addItem('第一项','cb')
.addToUi();
或:
使用未定义的cb
或someCallback
引发相同的错误
此问题
:
回答你的直接问题
也许有什么运行时方法可以获取库标识符
答案是肯定的,有点像
this
关键字功能非常强大,在运行时,您可以使用它以以下方式获取用户集标识符的名称:
function onOpen(){
myLib.initialize(this);
}
在myLib.initialize()
中:
控制台显示:['myLib','onOpen']
这个问题是,虽然导入的库的名称位于用户脚本中定义的函数列表之前,但如果导入了多个库,则无法分辨哪些键引用了您的库,哪些键引用了其他库。因此,仅调用name[0]
不会将其删除
做一些挖掘:
我开始使用,发现有些功能请求与您的用例非常相似:
initialize()
函数需要传递库的识别名称。根据任何标准,这都不是一个优雅的解决方案,但考虑到的复杂性和尚未实现的功能请求,这可能是最简单的选择
可能可以循环使用对象.keys(this)
数组,但我觉得这是一个非常粗糙的解决方法,可能会带来更多的问题(特别是如果,例如,另一个库创建者碰巧也有一个名为someCallback
的函数)
我知道这通常是个坏消息,但我希望这对你有帮助
参考资料:
尽管我不确定这是否是您期望的方向,例如,将const someCallback=()=>myLib.someCallback()放在
到客户端?如果最终用户将标识符从myLib更改为其他的东西,您所说的是什么意思?例如const newIdentifier=myLib;
?嘿@Rafa so在“参考资料>库”的屏幕上“当他们真正启用Lib时,他们可以选择将标识符更改为他们想要的任何内容。因此,与其使用myLib
,不如将其称为其他变量名。
function initialize(name) {
console.log(Object.keys(name));
}