うん、同様の問題。
私は約20のスプレッドシートを持っていますが、すべてのスクリプトをばかげたコードで更新するのは非常に退屈です。
function doSomething(){ myLib.doSomething();}
メインライブラリに新しいメニューエントリを追加するたびに。
だから私は多かれ少なかれ汚い回避策を見つけました-メニューエントリをlibの「プロキシ」関数にリンクし、事前にクライアントスプレッドシートにいくつかの同様の関数を作成します(すべてのクライアントスプレッドシートに対して1回実行します)
//-----------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-----------
現時点では、menuEntries配列のみを更新できるように少し拡張されたバージョンを使用しています。ここにあります:
//-----------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-----------