如何从应用程序脚本库中调用 CreateMenu()?



我正在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
  • 谷歌的问题跟踪器

相关内容

  • 没有找到相关文章

最新更新