7

新しいスプレッドシート メニューを作成する特定の機能を持つライブラリを作成しました (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

2 に答える 2

4

うん、同様の問題。

私は約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-----------
于 2012-10-12T11:51:54.907 に答える
4

何を呼んでいるのか100%わかりませんが、これは既知の問題だと思います。

上位レベルからではなく、メニューから直接関数を呼び出す必要があるようです。

ここに良い例があります。

質問を詳しく見ると、スプレッドシートのさまざまなメニューで同じ関数を呼び出そうとしているようです。私がリンクしたバグに基づくと、ローカル関数を定義し、それを使用してスクリプトを操作する必要があるため、おそらくこれを行うことはできません。

于 2012-10-03T20:42:50.647 に答える