I will distribute a spreadsheet with onOpen menu among several users. I would like to keep the menu definitions and functionality within a Library, so if I add some menu opt
Good news! This works in the new Google Sheets. It's Apr 4, 2014 and you still have to go to your Google Drive settings and check "Use the new Google Sheets." (Caution: Beta = Bugs). This will only work in the new Sheets, if you're working on an Old Sheet it won't work.
~~in your library~~
var menu = SpreadsheetApp.getUi().createMenu('Magical Menu');
menu.addItem('Do The Thing', 'LibraryName.function_name');
menu.addToUi();
~~~
Last I checked you cannot give to a trigger functions that are not contained within the script. What you most likely need to do is to create a wrapper function in the script for your scpreadsheet. Something like this:
function doSomething() {
myLib.doSomething();
}
EDIT: The functionality that you are looking for is currently unavailable. To achieve the desired effect you would need to specify that the function that you want to call belongs to the library and that is not allowed.
There is a feature request for this:
http://code.google.com/p/google-apps-script-issues/issues/detail?id=799
If you are interested in having this functionality, please go and vote on this issue to increase its priority.
Best,
Anton
error like: "Script function someFunction1 could not be found" is tring to call someFunction1 in the "local" code not the lib
see; https://code.google.com/p/google-apps-script-issues/issues/detail?id=1346
you can work around this by adding a stub function to the "local" code.
This is how I solved my works
// ----myLibrary----
function loadMenu() {
var menuList = [
{ name: 'New', functionName: 'myLibrary.addData' },
{ name: 'Modify', functionName: 'myLibrary.modifyData' },
{ name: 'Delete', functionName: 'myLibrary.deleteData' },
];
return menuList;
}
function modifyData() {
Logger.log('called by modifyData');
}
function addData() {
Logger.log('called by addData');
}
function deleteData() {
Logger.log('called by deleteData');
}
// ----myLibrary----
// -----Client-------
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuList = myLibrary.loadMenu();
ss.addMenu('Custom Menu', menuList);
}
// -----Client-------