1

誰でもこのコードで何か間違っていることがわかりますか

  // make new ssheet
  var payablesNewDoc=SpreadsheetApp.getActiveSpreadsheet().copy(newName); // NB  undocumented function

  // Create onEdit trigger for the new Spreadsheet
var onEditTrigger = ScriptApp.newTrigger("onChange")
      .forSpreadsheet(payablesNewDoc)
      .onEdit()
      .create();

  Logger.log(onEditTrigger.getHandlerFunction());  // logs "onChange"
  Logger.log(onEditTrigger.getEventType());        // logs "ON_EDIT"

エラーなしで実行され、2 つのログ メッセージは、トリガーが作成されたことを示しているようです。ただし、新しいスプレッドシートを開いて編集すると、何も起動されず、スクリプト エディターに宣言されたトリガーが表示されません。

4

2 に答える 2

1

このスレッドで別のグーグルドキュメントスプレッドシートに「編集トリガー」をインストールする方法はありますか?

「別のスプレッドシートにonEditトリガーを追加することは可能ですが、トリガーは常にそれを作成したスクリプトに属し、作成したスクリプト内でのみ関数を実行できます。– Eric Koleda Jun 30at0:05」

おそらくこれが説明ですか?

于 2012-12-31T07:01:37.370 に答える
1

この例では、ホスト シートとスクリプトのコピーを作成しているように見えるためonEdit、テンプレート スクリプト内の単純なトリガーとして追加できます。つまり、次のように定義された関数ですfunction onEdit() { // do stuff }

この関数は、スプレッドシート自体とともにコピーされます。

function onEdit() {
  // This function being present will automatically add an onEdit trigger
  // It can act as a parent for calling any other functions
  // e.g. onChange() as per your example
}

同じスクリプトの多くのコピーが浮かんでいる可能性が高い場合に行うことができる改善の 1 つは、別の場所のライブラリでホストされているハンドラー関数を呼び出して、トリガーされたコードを 1 か所に保持することです。開発モードをオンにして外部スクリプトをライブラリとして添付すると、このライブラリは元のスプレッドシートに作成したコピーにも添付されます。これにより、すべてのコピーを開くことなく、トリガーされたコードを修正できます

最初にトリガーしたい関数を複製するハンドラー関数を使用して、スタンドアロンの GS スクリプトを作成します。したがって、アクティブなシートを Id で渡す必要があります。

function editFunction(event) {
  try {
    var range = event.source.getActiveSheet().getActiveSelection();
    return  "cells "      + range.getA1Notation()        + \
           " changed to " + range.getValues().toString() + \
           " in \""       + event.source.getName()       + \
           "\" by "       + Session.getEffectiveUser();
  } catch (err) {
    return err;
  }
}

次に、テンプレート スプレッドシートで、外部スクリプトをライブラリとして追加します (例: という名前EditLibrary)。

単純な関数内でonEdit()は、インラインではなく Library 関数を呼び出すだけです。イベントの詳細をパラメーターとして渡します。

function onEdit() {
  Browser.msgBox(EditLibrary.editFunction(eventObject));
}

これにより、triggerBuilder を使用する必要がなく、後でコードを修正できるようにする必要があります。

于 2012-12-31T16:02:38.327 に答える