160

Google スプレッドシートでは、いくつかのスクリプト機能を追加できます。イベント用に何かを追加してonEditいますが、機能しているかどうかわかりません。私の知る限り、Google スプレッドシートからライブ イベントをデバッグすることはできないため、デバッガから実行する必要がありますonEdit()Script Editor.

Logger.logそのため、関数が呼び出されるたびにメソッドを使用してデータをログに記録しようとしていましonEditたが、これも から実行した場合にのみ機能するようScript Editorです。から実行すると、次の場所Script Editorに移動してログを表示できますView->Logs...

イベントが実際に実行されたときのログを確認できることを望んでいましたが、わかりません。

このようなものをデバッグするにはどうすればよいですか?

4

12 に答える 12

93

アップデート:

この回答に 書かれているように、


Logger.logは、スクリプトで発生したエラーの電子メールを (最終的に) 送信します。または、 から実行している場合は、(まだスクリプト エディターで) にScript Editor移動して、最後の実行関数のログを表示できます。View->Logs繰り返しますが、内部からScript Editor実行した最後の関数からログに記録されたものだけが表示されます。

私が作業しようとしていたスクリプトは、スプレッドシートに関係していました.優先度などでアイテムをソートするスプレッドシートのtodo-checklistタイプのものを作成しました。

そのスクリプト用にインストールしたトリガーは、onOpen トリガーと onEdit トリガーだけでした。onEdit 関数にブレークポイントを設定し、スプレッドシートを開き、セルを編集すると、ブレークポイントがトリガーされると考え続けたため、onEdit トリガーのデバッグが最も困難でした。これはそうではありません。

セルを編集したことをシミュレートするは、実際のスプレッドシートで何かをしなければなりませんでした。私がしたことは、「編集済み」として扱いたいセルが選択されていることを確認することだけでしScript EditorRun->onEdit。次に、私のブレークポイントがヒットします。

ただし、onEdit 関数に渡されるイベント引数の使用を停止する必要がありました。実行してシミュレートすることはできませんRun->onEdit。どのセルが選択されたかなど、スプレッドシートから必要な情報はすべて、手動で把握する必要がありました。

とにかく、長い答えですが、最終的にはわかりました。


編集

私が作ったtodoチェックリストを見たい方はこちらからチェックできます

(はい、誰でも編集できることは知っています。それが共有のポイントです!)

スクリプトも表示できるようになることを望んでいました。ここでは見えないので、以下に示します。

function onOpen() {
  setCheckboxes();
};

function setCheckboxes() {
  var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
  var checklist_data_range = checklist.getDataRange();
  var checklist_num_rows = checklist_data_range.getNumRows();
  Logger.log("checklist num rows: " + checklist_num_rows);

  var coredata = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
  var coredata_data_range = coredata.getDataRange();

  for(var i = 0 ; i < checklist_num_rows-1; i++) {
    var split = checklist_data_range.getCell(i+2, 3).getValue().split(" || ");
    var item_id = split[split.length - 1];
    if(item_id != "") {
      item_id = parseInt(item_id);
      Logger.log("setting value at ("+(i+2)+",2) to " + coredata_data_range.getCell(item_id+1, 3).getValue());
      checklist_data_range.getCell(i+2,2).setValue(coredata_data_range.getCell(item_id+1, 3).getValue());
    }
  }
}

function onEdit() {
  Logger.log("TESTING TESTING ON EDIT");
  var active_sheet = SpreadsheetApp.getActiveSheet();
  if(active_sheet.getName() == "checklist") {
    var active_range = SpreadsheetApp.getActiveSheet().getActiveRange();
    Logger.log("active_range: " + active_range);
    Logger.log("active range col: " + active_range.getColumn() + "active range row: " + active_range.getRow());
    Logger.log("active_range.value: " + active_range.getCell(1, 1).getValue());
    Logger.log("active_range. colidx: " + active_range.getColumnIndex());
    if(active_range.getCell(1,1).getValue() == "?" || active_range.getCell(1,1).getValue() == "?") {
      Logger.log("made it!");
      var next_cell = active_sheet.getRange(active_range.getRow(), active_range.getColumn()+1, 1, 1).getCell(1,1);
      var val = next_cell.getValue();
      Logger.log("val: " + val);
      var splits = val.split(" || ");
      var item_id = splits[splits.length-1];
      Logger.log("item_id: " + item_id);

      var core_data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
      var sheet_data_range = core_data.getDataRange();
      var num_rows = sheet_data_range.getNumRows();
      var sheet_values = sheet_data_range.getValues();
      Logger.log("num_rows: " + num_rows);

      for(var i = 0; i < num_rows; i++) {
        Logger.log("sheet_values[" + (i) + "][" + (8) + "] = " + sheet_values[i][8]);
        if(sheet_values[i][8] == item_id) {
          Logger.log("found it! tyring to set it...");
          sheet_data_range.getCell(i+1, 2+1).setValue(active_range.getCell(1,1).getValue());
        }
      }

    }
  }

  setCheckboxes();
};
于 2012-08-07T14:39:10.387 に答える
34

私が知る限り、Google ドキュメントからライブ イベントをデバッグすることはできないため、デバッガから実行する必要があります。onEdit() 関数に渡されるイベント引数は、スクリプト エディタから。

True - デバッグ用にイベント引数を自分で定義します。GAS でトリガー機能をテストするにはどうすればよいですか? を参照してください。

onEdit 関数が呼び出されるたびに Logger.log メソッドを使用してデータを記録しようとしましたが、これもスクリプト エディターから実行した場合にのみ機能するようです。Script Editor から実行すると、[View] -> [Logs...] に移動してログを表示できます。

繰り返しますが、助けがあります。Peter Hermann のBetterLog ライブラリは、すべてのログをスプレッドシートにリダイレクトし、エディター/デバッガーのインスタンスにアタッチされていないコードからでもログを記録できるようにします。

たとえば、スプレッドシートに含まれるスクリプトをコーディングしている場合、スクリプト ファイルの先頭にこの 1 行を追加するだけで、すべてのログがスプレッドシートの [ログ] シートに移動します。他のコードは必要ありませんLogger.log()。通常どおりに使用してください。

Logger = BetterLog.useSpreadsheet();
于 2014-11-18T20:02:50.253 に答える
16

私はこれらの投稿を調べて、どういうわけか簡単な答えを見つけました。短くて甘い解決策が必要な人のためにここに投稿しています。

  1. console.log("Hello World")スクリプトで使用します。
  2. https://script.google.com/home/myにアクセスして、アドオンを選択します。
  3. Project Details の省略記号メニューをクリックし、Executions を選択します。

ここに画像の説明を入力

  1. 最新の実行のヘッダーをクリックして、ログを読みます。

ここに画像の説明を入力

于 2020-01-04T06:46:49.317 に答える
5

スクリプト エディタを開いている場合は、[表示] -> [ログ] の下にログが表示されます。スクリプトに onedit トリガーがある場合は、2 番目のタブで開いたスクリプト エディターで関数をトリガーする必要があるスプレッドシートに変更を加えます。次に、スクリプト エディター タブに移動し、ログを開きます。関数がロガーに渡すものは何でも表示されます。

基本的に、スクリプト エディターが開いている限り、イベントはログに書き込まれ、表示されます。他の誰かが別のファイルにいる場合は表示されません。

于 2016-09-28T12:51:30.603 に答える
4

私は同じ問題を抱えています.Webのどこかで以下を見つけました....

ただし、Docs のイベント ハンドラーは少し扱いに​​くいものです。ドキュメントは複数のユーザーによる複数の同時編集を処理できるため、イベント ハンドラーはサーバー側で処理されます。この構造の主な問題は、イベント トリガー スクリプトが失敗すると、サーバー上で失敗することです。デバッグ情報を見たい場合は、イベントが失敗したときにデバッグ情報を電子メールで送信するトリガー メニューの下に明示的なトリガーを設定する必要があります。

于 2012-08-07T13:06:29.427 に答える
1

エレガントとは言えませんが、デバッグ中はロガーにログを記録し、getLog()を使用してその内容をフェッチすることがよくあります。次に、次のいずれかを行います。

  • 結果を変数に保存します (これは Google Scripts デバッガーで調べることができます。これは、一部のコードにブレークポイントを設定できないが、後で実行されるコードにブレークポイントを設定できる場合を回避します)
  • 一時的なDOM要素に書き込む
  • アラートで表示する

基本的に、 JavaScript の出力の問題になるだけです。

現代のconsole.log()実装の機能が著しく欠けていますが、Logger は依然として Google Script のデバッグに役立ちます。

于 2015-08-18T15:36:18.987 に答える
0

現在、ドキュメント内でスクリプトを使用するというコンテナー バウンドの性質に制限されています。ドキュメントの外で新しいスクリプトを作成すると、情報を Google スプレッドシートにエクスポートして、ログ ツールのように使用できます。

たとえば、最初のコードブロックで

function setCheckboxes() {

    // Add your spreadsheet data
    var errorSheet = SpreadsheetApp.openById('EnterSpreadSheetIDHere').getSheetByName('EnterSheetNameHere');
    var cell = errorSheet.getRange('A1').offset(errorSheet.getLastRow(),0);

    // existing code
    var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
    var checklist_data_range = checklist.getDataRange();
    var checklist_num_rows = checklist_data_range.getNumRows();

    // existing logger
    Logger.log("checklist num rows: " + checklist_num_rows);

   //We can pass the information to the sheet using cell.setValue()
    cell.setValue(new Date() + "Checklist num rows: " + checklist_num_rows);

私が GAS で作業しているときは、2 つのモニター (2 つのウィンドウを使用できます) があり、1 つには GAS 環境が含まれ、もう 1 つには SS が含まれているため、情報を書き込んでログを取ることができます。

于 2014-11-25T16:45:41.907 に答える