我创建了一个库,该库具有创建新电子表格菜单的特定功能(使用addMenu)。我的菜单选项应该调用我的库中的其他函数来执行操作。
// Bare Minimum Deployment on a blank spreadsheet with
// my library registered (called myLibraryName for this example).
function onOpen() {
myLibraryName.setMenus(); // creating new drop-down menus
}
function onEdit(event) {
myLibraryName.doEvent(event); // sending the onEdit event to a function in my library.
}
现在的问题是,当我选择一个菜单选项时,谷歌应用程序脚本会给我一条错误消息,例如
找不到脚本函数 myMenuFunction
所以我尝试在我的菜单条目中添加前缀
menuEntries.push({name: "About", functionName: "myLibraryName.myMenuFunction"});
但它也不起作用。
因此,我正在征求有关如何创建一个库的建议,该库可以创建链接到库中函数的菜单。
我不是 100% 确定你在说什么,但我认为这是一个已知问题。
看起来您需要直接从菜单调用函数,而不是从上层调用它。
这里有一个很好的例子。
仔细观察您的问题,您似乎正在尝试在电子表格中的不同菜单中调用相同的函数。根据我链接的错误,您可能无法执行此操作,因为您需要定义一个本地函数并使用它来与脚本交互。
是的,类似的问题。
我有大约二十个电子表格,用愚蠢的代码更新所有脚本很无聊:
function doSomething(){ myLib.doSomething();}
每次我在主库中添加新的菜单条目时。
所以我发现了或多或少肮脏的解决方法 - 将菜单条目链接到 lib 中的"代理"函数,并提前在客户端电子表格中创建几个类似的函数(对所有客户端电子表格执行一次)
//-----------LIB-----------
function libMenu() {
var mySheet = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [ {name: "Increment current cell", functionName: "processMenuEntry0"},
{name: "Do something with row", functionName: "processMenuEntry1"}
];
mySheet.addMenu("Library Functions", menuEntries);
}
function processMenuEntry0() { incrementCurrentCell();}
function processMenuEntry1() { doSomethingWithRow(); }
//-----------LIB-----------
//-----------CLIENT-----------
function onOpen() {
Library.libMenu();
}
function processMenuEntry0() {gTracking.processMenuEntry0();}
function processMenuEntry1() {gTracking.processMenuEntry1();}
function processMenuEntry2() {gTracking.processMenuEntry2();}
function processMenuEntry3() {gTracking.processMenuEntry3();}
// etc.
// I have reserved twenty menu entries in a such way
//-----------CLIENT-----------
目前,我确实使用了一些增强版本,它允许我仅更新menuEntries 数组。在这里:
//-----------LIB-----------
var menuEntries = [ {name: "Increment current cell", functionName: "incrementCurrentCell"},
{name: "Do something with row", functionName: "doSomethingWithRow"}
];
//returns menu entries with changed 'functionName' parameter (-> "processMenuEntry" + id)
function convertMenuEntries() {
var newMenuEnties=[];
for (var i=0; i< menuEntries.length ;i++){
if (menuEntries[i] == null) {// for line separators
newMenuEnties.push(null);
continue;
}
newMenuEnties.push({name: menuEntries[i]["name"], functionName: "processMenuEntry" + i});
}
return newMenuEnties;
}
function libMenu() {
var mySheet = SpreadsheetApp.getActiveSpreadsheet();
mySheet.addMenu("Library Functions", convertMenuEntries());
}
// get function name from menuEntries array and call it
function processMenuEntry(id){
this[menuEntries[id]["functionName"]]();
}
function processMenuEntry0() {processMenuEntry(0);}
function processMenuEntry1() {processMenuEntry(1);}
// etc.
//-----------LIB-----------
//-----------CLIENT-----------
function onOpen() {
Library.libMenu();
}
function processMenuEntry0() {gTracking.processMenuEntry0();}
function processMenuEntry1() {gTracking.processMenuEntry1();}
function processMenuEntry2() {gTracking.processMenuEntry2();}
function processMenuEntry3() {gTracking.processMenuEntry3();}
// etc.
//-----------CLIENT-----------