2012-10-03 14 views
6

मैंने एक लाइब्रेरी बनाई है जिसमें एक विशिष्ट फ़ंक्शन है जो नया स्प्रेडशीट मेनू बनाते हैं (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. 
} 

अब मुद्दा यह है कि जब मैं एक मेनू विकल्प चुनते हैं, तो Google एप्लिकेशन स्क्रिप्ट मुझे myMenuFunction

नहीं पाया जा सका तो

स्क्रिप्ट फ़ंक्शन की तरह एक त्रुटि संदेश देता है मैंने अपने मेनू प्रविष्टि में एक उपसर्ग जोड़ने की कोशिश की

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

लेकिन यह भी काम नहीं कर रहा है।

तो मैं पुस्तकालय बनाने के तरीके के बारे में सुझाव मांग रहा हूं जो लाइब्रेरी के भीतर कार्यों से जुड़े मेनू बना सकते हैं।

उत्तर

4

मुझे 100% यकीन नहीं है कि आप क्या कॉल कर रहे हैं, लेकिन मुझे लगता है कि यह एक ज्ञात मुद्दा है।

ऐसा लगता है कि आपको सीधे मेनू से फ़ंक्शन कॉल करने की आवश्यकता है, इसे ऊपरी स्तर से कॉल न करें।

good example here है।

अपने प्रश्न को देखने में, ऐसा लगता है कि आप अपनी स्प्रेडशीट में अलग-अलग मेनू में एक ही फ़ंक्शन को कॉल करने का प्रयास कर रहे हैं। मैंने जो बग लिंक किया है, उसके आधार पर, आप शायद ऐसा नहीं कर सकते क्योंकि आपको स्थानीय फ़ंक्शन को परिभाषित करने और स्क्रिप्ट के साथ बातचीत करने के लिए इसका उपयोग करने की आवश्यकता है।

+0

हाँ, वास्तव में, कि वास्तव में है [जारी 1355] (http://code.google.com/p/google-apps-script-issues/issues/detail?id=1355) ! तो मुझे लगता है कि मुझे प्रत्येक कॉल को एक लाइब्रेरी फ़ंक्शन में स्थानीय फ़ंक्शन में लपेटने की आवश्यकता होती है जो मेनू में बाद में जोड़े जाने वाले लाइब्रेरी और कई क्लाइंट द्वारा उपयोग की जाने वाली लाइब्रेरी में बड़ी असुविधा होती है। – VanacK

+0

हां, निश्चित रूप से असुविधाजनक है, लेकिन अगर आप दृढ़ता से महसूस करते हैं तो उस मुद्दे की सदस्यता लें और टिप्पणी करें। यह हमेशा लोगों को समाधान के बारे में जानने में मदद करता है। – OnenOnlyWalter

3

हाँ, इसी तरह की समस्या।

मैं लगभग बीस स्प्रेडशीट है और यह मूर्खतापूर्ण कोड के साथ अपने सभी लिपियों अद्यतन करने के लिए काफी बोरिंग है:

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

हर बार जब मैं मुख्य lib में नए मेनू प्रविष्टि जोड़ें।

तो मैं और अधिक या कम गंदा वैकल्पिक हल मिल गया है - लिंक मेनू प्रविष्टियां 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----------- 

फिलहाल मैं थोड़ा बढ़ाया संस्करण का उपयोग करता हूं जो मुझे केवल मेन्यून्ट्रीज़ सरणी को अपडेट करने की अनुमति देता है। संदेश यह है:

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

क्या आपको अभी तक एक बेहतर तरीका मिला है? निश्चित रूप से Google को पुस्तकालय के उपयोगकर्ता को इतना कोड जोड़ने की आवश्यकता के बिना ऐसा करने का एक नया बेहतर तरीका है ... – Angelo