我正在Apps Script中构建一个库,并希望使其能够自我维持。从本质上讲,如果有人想在他们的Google表格中使用此库,他们只需要在他们的表格脚本中输入以下代码
。function onOpen(){
myLib.initialize();
}
这将根据需要设置工作表。我在这里做的一件事是在工作表本身中实际添加一个菜单项。因此,在我的图书馆代码中,我会有类似的东西;
function initialize(){
var ui = SpreadsheetApp.getUi();
ui.createMenu('Custom Menu')
.addItem('First item', 'someCallback')
.addToUi();
}
这种方法的问题在于,当单击菜单项时,找不到">someCallback"函数。这是有道理的,因为它驻留在一个单独的库中。应该使用这样的点符号来调用它:myLib.someCallback
有没有办法在运行时获取库标识符,以便我可以创建创建菜单所需的字符串?
我可以做一些不是我第一选择的事情,例如:
- 将">myLib"字符串传递给初始化函数
- 直接在
addItem()
函数中输入">myLib",但我认为这不是好的做法,如果最终用户将标识符从myLib更改为其他内容怎么办。
也许有一些运行时方法可以获取库标识符?
答案:
不幸的是,目前这是不可能的。
更多信息:
我使用this
关键字和eval()
函数测试了一些东西,以便动态获取重新定义的myLib
标识符或直接在initialize
函数中调用someCallback
,但甚至在initialize
中嵌入回调函数:
funciton initialize() {
var cb = function someCallback() {
// do stuff
};
var ui = SpreadsheetApp.getUi();
ui.createMenu('Custom Menu')
.addItem('First item', 'cb')
.addToUi();
或:
function initialize() {
function someCallback() {
//do stuff
}
var ui = SpreadsheetApp.getUi();
ui.createMenu('Custom Menu')
.addItem('First item', 'someCallback')
.addToUi();
}
抛出相同的错误,cb
或未定义someCallback
。
this
问题 :
回答您的直接问题
也许有一些运行时方法可以获取库标识符?
答案是肯定的。有点。
this
关键字非常强大,在运行时,您可以通过以下方式使用它来获取用户设置标识符的名称:
function onOpen(){
myLib.initialize(this);
}
在myLib.initialize()
:
function initialize(name) {
console.log(Object.keys(name));
}
控制台显示:['myLib', 'onOpen']
这个问题是,虽然导入的库的名称位于用户脚本中定义的函数列表之前,但如果导入了多个库,则无法分辨哪些键引用了您的库,哪些键引用了其他键。结果只是打电话给name[0]
不会削减它。
做一些挖掘:
我访问了Google的问题跟踪器,发现有一些功能请求的用例与您的用例非常相似:
- AddMenu应该能够使用匿名函数或至少传递参数
- AddMenu 应该能够将对象方法关联到菜单项,而不仅仅是全局函数
虽然用例并不完全相同,但两者的根本问题是匿名函数或参数可以传递给使用 Apps Script 的 UI 方法的库。
还有一个相关的功能请求,它要求实现一个 catch-all 样式方法,如果调用不存在的库方法,该方法将运行一个方法:
- _noSuchMethod_ for Library ( Google Apps 脚本中的未定义方法(
怎么办:
通常,我建议点击问题跟踪器链接并单击星号。但是,在这种情况下,由于您的用例未在上述链接的功能请求范围内准确定义,因此我敦促您使用此链接提交应用程序脚本功能请求,并详细说明您在问题中输入的所有信息。
就解决方法而言;在此期间,您可以做的最好的事情是记录initialize()
函数需要传递库的标识名称。从任何标准来看,它都不是一个优雅的解决方案,但考虑到this
的复杂性和尚未实现的功能请求,这可能是最简单的选择。
也许可以遍历Object.keys(this)
数组,但我觉得这是一种非常笨拙的解决方法,可能会引入不必要的问题(特别是如果,例如,另一个库创建者也碰巧有一个名为someCallback
的函数......
引用:
- JavaScriptthis关键字 - w3schools
- 谷歌的问题跟踪器