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