gpt4 book ai didi

google-apps-script - 如何从 Apps 脚本库中调用 CreateMenu()?

转载 作者:行者123 更新时间:2023-12-04 15:24:58 30 4
gpt4 key购买 nike

我正在 Apps 脚本中构建一个库,并希望它能够 self 维持。本质上,如果有人想在他们的 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 的重新定义标识符或调用 someCallback直接在 initialize函数,但是甚至将回调函数嵌入内部 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 的问题:

直接回答你的问题

Maybe there's some Runtime way that I can get the Library Identifier?

答案是肯定的。 有点。

this关键字非常强大,在运行时您可以使用它通过以下方式获取用户设置标识符的名称:

function onOpen(){
myLib.initialize(this);
}

并且在 myLib.initialize() :

function initialize(name) {
console.log(Object.keys(name));
}

控制台显示:['myLib', 'onOpen']

这个问题是,虽然导入库的名称出现在用户脚本中定义的函数列表之前,但如果导入了多个库,您无法告诉哪个键指的是您的图书馆,而哪些指的是其他图书馆。结果只是调用name[0]不会削减它。

做一些挖掘:

我去了Google's Issue Tracker并发现有一些功能请求与您的用例非常相似:

虽然用例不完全相同,但两者的根本问题是匿名函数或参数无法传递给使用 Apps 脚本的 UI 方法的库。

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

做什么:

通常,我会建议关注问题跟踪器链接并单击星标。但是,在这种情况下,由于您的用例未完全定义在上述功能请求的范围内,我建议您使用 this link提交 Apps 脚本功能请求并详细说明您在问题中提供的所有信息。

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

可能可以遍历 Object.keys(this) array 但我觉得这是一个非常 hacky 的解决方法,它可能会引入更多不必要的问题(特别是如果,例如,另一个库创建者也恰好有一个名为 someCallback 的函数 ...)

引用资料:

关于google-apps-script - 如何从 Apps 脚本库中调用 CreateMenu()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62457605/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com