web-dev-qa-db-ja.com

Google Apps Scriptのデバッグ方法(別名Logger.logはどこにログを記録しますか?)

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

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

私は、イベントが実際に実行されたときからログを見ることができることを望んでいましたが、それを理解することはできません。

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

109
Markus Orreilly

UPDATE:

this answerに書かれているように、


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

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

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

セルを編集したことをシミュレートするために、Ididは実際のスプレッドシートで何かをする必要があります。 「編集済み」として処理するセルが選択されていることを確認し、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();
};
74
Markus Orreilly

私の知る限り、Google Docsからライブイベントをデバッグすることはできません。したがって、デバッガから実行する必要があります。これは、onEdit()関数に渡されるイベント引数は、スクリプトエディタから。

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

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

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

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

Logger = BetterLog.useSpreadsheet();
31
Mogsdad

2017 Update:Stackdriver Logging がGoogle Apps Scriptで利用可能になりました。スクリプトエディターのメニューバーから、[View > Stackdriver Logging]に移動して、ログを表示またはストリーミングします。

console.log()DEBUGレベルのメッセージを書き込みます

onEdit()ロギング:

function onEdit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    range:  e.range.getA1Notation(),    
    source:  e.source.getId(),
    user:  e.user,   
    value:  e.value,
    oldValue: e. oldValue
  }

  console.log({message: 'onEdit() Event Object', eventObject: debug_e});
}

次に、 Stackdriver UIonEdit() Event Objectというラベルのログを確認して、出力を確認します

18
random-parts

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

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

5
Karl_S

少しハックしますが、「コンソール」と呼ばれる配列を作成し、コンソールに出力したいときはいつでも配列にプッシュしました。その後、実際の出力を確認したいときはいつでも、以前に返されたものの代わりにconsoleを返しました。

    //return 'console' //uncomment to output console
    return "actual output";
}
5
woojoo666

私は同じ問題を抱えています、私はどこかでウェブ上で以下を見つけました....

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

4
Angus Keenan

洗練されたものとはほど遠いですが、デバッグ中にしばしばLoggerにログを記録し、 getLog() を使用してその内容を取得します。次に、私は:

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

基本的に、それは単に JavaScript出力 の問題になります。

それは現代のconsole.log()実装の機能を大きく欠いていますが、ロガーはまだGoogleスクリプトのデバッグを支援します。

1
Michael Scheper

次のようにスプレッドシートコードをデバッグするだけです。

...
throw whatAmI;
...

次のように表示されます。

enter image description here

1
Toskan

現在、ドキュメント内でスクリプトを使用するコンテナにバインドされた性質に制限されています。ドキュメントの外部で新しいスクリプトを作成すると、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を使用しているとき、GAS環境を含むモニターとSSを含むモニターを2つのモニター(2つのウィンドウを使用できます)でセットアップし、情報の書き込みとログ記録を行えるようにします。

0
JForgie

ちょうど通知として。スプレッドシートのテスト関数を作成しました。 onEdit(e)関数でgoogle throws変数を使用します(eと呼びます)。次に、次のようなテスト関数を作成しました。

function test(){
var testRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,7)
var testObject = {
    range:testRange,
    value:"someValue"
}
onEdit(testObject)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,6).setValue(Logger.getLog())
}

このテスト関数を呼び出すと、スプレッドシートでイベントが発生したときにすべてのコードが実行されます。編集したセルの位置に入れただけで、予期しない結果が出ました。値をセルに入力した値として設定しました。 OBS! googlesが関数に与えるその他の変数については、こちらをご覧ください: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

0
Meltinglava

開発コンソールは、アプリスクリプトによってスローされたエラーをログに記録するため、エラーをスローして、通常のconsole.logとしてログに記録することができます。実行は停止しますが、ステップバイステップのデバッグには引き続き役立つ場合があります。

throw Error('hello world!');

console.log('hello world')と同様にコンソールに表示されます

0
qwerty