7

onOpenメニューのあるスプレッドシートを複数のユーザーに配布します。メニューの定義と機能をライブラリ内に保持したいので、いくつかのメニューオプションを追加したり、いくつかの機能を更新したりすると、そのスプレッドシートを使用するすべての人が自動的に更新されます。

これまでのところ、スプレッドシートスクリプトには、次の単純なコードしかありません。

function onOpen() {
  myLib.loadMenu();
}

メニューは問題なくスプレッドシートに読み込まれますが、メニューの呼び出しと実際の関数(myLibの有無にかかわらず)にどのように名前を付けても、オプションを使用すると常に「スクリプト関数doSomethingが見つかりませんでした」というエラーが発生します。そのメニューから。

このアプローチを機能させるには、メニューの関数呼び出しとライブラリの実際の関数にどのように名前を付ける必要があるかについてのアイデア。

ありがとう、ファウスト

編集-1:詳細とサンプルコードを教えてください

私の目標は、すべてのユーザーのスプレッドシートを更新しなくても、ライブラリからそのスプレッドシートメニューにオプションを追加できるようにすることです。

これはすべてスプレッドシートスクリプトに含まれているサンプルコードであり、ライブラリはまだ使用されておらず、問題なく機能します

function onOpen() {
  testMenu();
}
function testMenu() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu(
    'Testing', [
      { name: 'Do Something #1', functionName: 'someFunction1' },
      null,
      { name: 'Do Something #2', functionName: 'someFunction2' } ]);
}
function someFunction1() {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue("Hello from someFunction1");
}
function someFunction2() {
  SpreadsheetApp.getActiveSheet().getRange("A2").setValue("Bye from someFunction2");
}

私がやりたいのは同じ機能を取得することですが、次のように、スプレッドシートスクリプトとライブラリの間でコードを分割します

スプレッドシートスクリプト

function onOpen() {
  xsLib.testMenu();
}

図書館で

function testMenu() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu(
    'Testing', [
      { name: 'Do Something #1', functionName: 'someFunction1' },
      null,
      { name: 'Do Something #2', functionName: 'someFunction2' } ]);
}
function someFunction1() {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue("Hello from someFunction1");
}
function someFunction2() {
  SpreadsheetApp.getActiveSheet().getRange("A2").setValue("Bye from someFunction2");
}

この分割アプローチでは、ライブラリ呼び出しから作成されたメニューがスプレッドシートに正しく表示されますが、そのテストメニューのオプションを使用すると、「スクリプト関数someFunction1が見つかりませんでした」などのメッセージエラーが表示されます。

4

4 に答える 4

2

最後に、スクリプトに含まれていないトリガー関数を指定できないことを確認しました。最も可能性が高いのは、scpreadsheet のスクリプトでラッパー関数を作成することです。このようなもの:

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

編集: 探している機能は現在利用できません。目的の効果を得るには、呼び出したい関数がライブラリに属しており、それが許可されていないことを指定する必要があります。

これには機能要求があります。

http://code.google.com/p/google-apps-script-issues/issues/detail?id=799

この機能に興味がある場合は、この問題に投票して優先度を上げてください。

一番、

アントン

于 2012-10-11T17:31:48.660 に答える
1

朗報です!これは、新しい Google スプレッドシートで機能します。2014 年 4 月 4 日ですが、Google ドライブの設定に移動して、[新しい Google スプレッドシートを使用する] をオンにする必要があります。(注意: ベータ = バグ)。これは新しいシートでのみ機能します。古いシートで作業している場合は機能しません。

~~あなたの図書館で~~

var menu = SpreadsheetApp.getUi().createMenu('Magical Menu');
menu.addItem('Do The Thing', 'LibraryName.function_name');
menu.addToUi();

~~~

于 2014-04-04T08:36:06.433 に答える
1

これが私が自分の作品を解決した方法です

// ----myLibrary----
function loadMenu() {
  var menuList = [
    { name: 'New', functionName: 'myLibrary.addData' },
    { name: 'Modify', functionName: 'myLibrary.modifyData' },
    { name: 'Delete', functionName: 'myLibrary.deleteData' },
  ];

  return menuList;
}

function modifyData() {
  Logger.log('called by modifyData');
}

function addData() {
  Logger.log('called by addData');
}

function deleteData() {
  Logger.log('called by deleteData');
}
// ----myLibrary----

// -----Client-------
function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuList = myLibrary.loadMenu();
  ss.addMenu('Custom Menu', menuList);
}
// -----Client-------
于 2019-03-16T18:03:15.983 に答える