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

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

我正在应用程序脚本中构建一个库,并希望它能够自我维持。本质上,如果有人想在他们的Google工作表中使用这个库,他们只需要在他们的工作表脚本中输入以下代码

function onOpen(){
  myLib.initialize();
}
这将根据需要设置表格。我在这里做的一件事就是在工作表中添加一个菜单项。因此,在我的库代码中,我将有如下内容:

function initialize(){
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Custom Menu')
      .addItem('First item', 'someCallback')
      .addToUi();
}
这种方法的问题是,当单击菜单项时,找不到“someCallback”函数。这是有意义的,因为它位于一个单独的库中。应该使用如下点符号调用它:
myLib.someCallback

是否有某种方法可以在运行时获取库标识符,以便创建创建菜单所需的字符串?

我可以做一些不是我第一选择的事情,例如:

  • 将“myLib”字符串传递给initialize函数
  • 直接在
    addItem()
    函数中键入“myLib”,但我认为这不是一种好的做法,如果最终用户将标识符从myLib更改为其他内容会怎么样
也许有什么运行时方法可以获取库标识符?

回答: 不幸的是,目前这是不可能做到的

更多信息: 我使用
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]
不会将其删除

做一些挖掘: 我开始使用,发现有些功能请求与您的用例非常相似:

虽然用例并不完全相同,但两者的根本问题是匿名函数和参数都可以传递给使用应用程序脚本的UI方法的库

还有一个相关的功能请求,它要求实现一个catch-all样式的方法,如果调用一个不存在的库方法,该方法将运行一个方法:

怎么办: 通常情况下,我建议您遵循问题跟踪链接并单击星号。但是,在这种情况下,由于您的用例未在上述链接功能请求的范围内准确定义,我建议您使用提交应用程序脚本功能请求,并详细说明您在问题中输入的所有信息

就解决方法而言,在此期间,您可以做的最好的事情是记录
initialize()
函数需要传递库的识别名称。根据任何标准,这都不是一个优雅的解决方案,但考虑到
的复杂性和尚未实现的功能请求,这可能是最简单的选择

可能可以循环使用
对象.keys(this)
数组,但我觉得这是一个非常粗糙的解决方法,可能会带来更多的问题(特别是如果,例如,另一个库创建者碰巧也有一个名为
someCallback
的函数)

我知道这通常是个坏消息,但我希望这对你有帮助

参考资料:

尽管我不确定这是否是您期望的方向,例如,将
const someCallback=()=>myLib.someCallback()放在
到客户端?如果最终用户将标识符从myLib更改为其他的东西,您所说的
是什么意思?例如
const newIdentifier=myLib;
?嘿@Rafa so在“参考资料>库”的屏幕上“当他们真正启用Lib时,他们可以选择将标识符更改为他们想要的任何内容。因此,与其使用
myLib
,不如将其称为其他变量名。
function initialize(name) {
  console.log(Object.keys(name));
}