2012-10-03 5 views
6

Ich habe eine Bibliothek mit einer bestimmten Funktion erstellt, die neue Tabellenkalkulationsmenüs erstellt (mit addMenu). Meine Menüoptionen sollten andere Funktionen in meiner Bibliothek aufrufen, um solche Aufgaben zu erledigen.So rufen Sie eine Bibliotheksfunktion über ein Tabellenkalkulations-Dropdownmenü auf, das von derselben Bibliothek generiert wurde

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

Nun das Problem ist, dass wenn ich eine Menüoption wählen, Google app Skript geben Sie mir eine Fehlermeldung wie

Script-Funktion myMenuFunction konnte nicht

So finden Ich habe versucht, ein Präfix in meinem Menüeintrag

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

Aber es funktioniert auch nicht.

So frage ich nach Vorschlägen zum Erstellen einer Bibliothek, die Menüs erstellen kann, die mit Funktionen innerhalb der Bibliothek verknüpft sind.

Antwort

4

Ich bin nicht 100% sicher, was Sie anrufen, aber ich denke, das ist ein bekanntes Problem.

Sieht so aus, als müssten Sie eine Funktion direkt aus dem Menü aufrufen, nicht von der oberen Ebene aus aufrufen.

Es gibt eine good example here.

Wenn Sie Ihre Frage näher betrachten, scheint es, als würden Sie dieselbe Funktion über verschiedene Menüs in Ihrer Tabelle aufrufen. Basierend auf dem Fehler, den ich verlinkt habe, können Sie dies wahrscheinlich nicht tun, da Sie eine lokale Funktion definieren und diese für die Interaktion mit dem Skript verwenden müssen.

+0

Ja, in der Tat, das ist genau das [Ausgabe 1355] (http://code.google.com/p/google-apps-script-issues/issues/detail?id=1355) ! Ich denke, ich muss jeden Aufruf einer Bibliotheksfunktion an eine lokale Funktion übergeben, was eine große Unannehmlichkeit darstellt, wenn Menüs später hinzugefügt werden und die Bibliothek von vielen Clients verwendet wird. – VanacK

+0

Ja, definitiv unbequem, aber abonnieren Sie dieses Problem und kommentieren Sie, wenn Sie sich stark fühlen. Es hilft immer zu wissen, dass Leute mit der Lösung beschäftigt sind. – OnenOnlyWalter

3

Ja, ähnliches Problem.

Ich habe etwa zwanzig Tabellen und es ist ziemlich langweilig, alle ihre Skripte mit dummem Code zu aktualisieren:

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

jedes Mal, wenn ich hinzufügen neuen Menüeintrag im Haupt lib. Link Menüeinträge auf „Proxy“ Funktionen in lib und erstellen mehrere ähnliche Funktionen in den Client-Tabellen im Voraus (do it einmal für alle Client-Tabellen)

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

So habe ich mehr oder weniger verschmutzt Abhilfe gefunden

Im Moment benutze ich eine wenig erweiterte Version, die mir erlaubt, nur menuEntries Array zu aktualisieren. Hier ist sie:

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

Haben Sie schon einen besseren Weg gefunden? Sicherlich hat Google eine neue verbesserte Möglichkeit, dies zu tun, ohne dass der Benutzer einer Bibliothek so viel Code hinzufügen muss ... – Angelo