2012-10-03 27 views
6

Creé una biblioteca que tiene una función específica que crea nuevos menús de hoja de cálculo (usando addMenu). Las opciones de mis menús deben llamar a otras funciones dentro de mi biblioteca para hacer cosas.Cómo llamar a una función de biblioteca desde un menú desplegable de hoja de cálculo generado por la misma biblioteca

// 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. 
} 

Ahora el problema es que cuando elijo una opción de menú, Google Apps Script dame un mensaje de error como función

Guión myMenuFunction no se puede conocer

Así Traté de agregar un prefijo en mi entrada de menú

menuEntries.push({name: "About", functionName: "myLibraryName.myMenuFunction"}); 

Pero tampoco funciona.

Por lo tanto, estoy solicitando sugerencias sobre cómo crear una biblioteca que pueda crear menús que estén vinculados a funciones dentro de la biblioteca.

Respuesta

4

No estoy 100% seguro de lo que está llamando, pero creo que este es un problema conocido.

Parece que necesita llamar a una función directamente desde el menú, no llamarla desde el nivel superior.

Hay un good example here.

Al acercar su pregunta, parece que está intentando llamar a la misma función en diferentes menús en su hoja de cálculo. Basado en el error que vinculé, probablemente no pueda hacer esto ya que necesita definir una función local y usar eso para interactuar con el script.

+0

Sí, de hecho, eso es exactamente [Edición 1355] (http://code.google.com/p/google-apps-script-issues/issues/detail?id=1355) ! Así que supongo que tengo que ajustar cada llamada a una función de biblioteca a una función local, lo que es un gran inconveniente si los menús se agregan más tarde y la biblioteca es utilizada por muchos clientes. – VanacK

+0

Sí, definitivamente inconveniente, pero suscríbase a ese problema y coméntelo si está convencido. Siempre ayuda saber que las personas se preocupan por la solución. – OnenOnlyWalter

3

Sí, problema similar.

tengo unos veinte hojas de cálculo y es muy aburrido para actualizar todos sus guiones con código de tonto:

function doSomething(){ myLib.doSomething();} 

cada vez que añadir nueva entrada en el menú principal en lib.

Así que he encontrado más o menos sucios solución - entradas del menú de enlace a las funciones de "proxy" en lib y crear varias funciones similares en las hojas de cálculo de los clientes con antelación (hago una vez para todas las hojas de cálculo de cliente)

//-----------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----------- 

Por el momento, sí uso una versión unhansed un poco que me permite actualizar la matriz de entradas de menú solamente. Aquí está:

//-----------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----------- 
+0

¿Has encontrado una mejor manera todavía? Seguramente, Google tiene una nueva forma mejorada de hacerlo sin requerir que el usuario de una biblioteca agregue tanto código ... – Angelo

Cuestiones relacionadas