Google Appsスクリプトをデバッグする方法(別名Logger.logはどこにログを記録しますか?)


129

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

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

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

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


3
ここで同じ問題-受け入れられた答えは答えませんが、たくさんの明白な間違った情報を与えます。
Hippyjim 2013年

彼らは今これを修正したようです。スプレッドシートからスクリプトエディターを開いている限り、スプレッドシートで実行するときは、そのタブを開いたままにしておきます。次に、スクリプトタブに戻ると、ログ情報が含まれています。
phreakhead 2017年

2
tldr; コピー、貼り付け、実行Logger.log('firstLog');MailApp.sendEmail({to:'yourEmailAddressHere@someone.com',subject: "subject here ^_^",body: Logger.getLog()});
Coty Embry

Maby承認された回答を変更するか、Stackdriver Loggingが利用可能であるというメモを追加する必要があります。
botenvouwer 2018

回答:


83

更新:

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


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

私が作業しようとしたスクリプトは、スプレッドシートを使用する必要がありました。私は、優先度などでアイテムを並べ替える、スプレッドシートのtodo-checklistタイプのものを作成しました。

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

セルを編集したシミュレートするために、私はなかったものの、実際のスプレッドシートで何かを持ってしまいます。「編集済み」として扱いたいセルが選択されていることを確認してからScript Editor、に移動しましたRun->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();
};

Pff、ログはメールでのみ表示されますか?スプレッドシートの実際のデータを効果的に使用することができないため、そのため、これらのデバッグ機能とログ機能はすべて役に立たなくなります。
MrFox 2013

いいえ。作成者が言ったように、ログはログ(スクリプトエディター、ビュー、ログ、またはCtrl-Enter)で利用できます
Rainabba

9
@rainabbaはい、スクリプトエディターでログを記録できます。ただし、スクリプトがイベント引数に依存しており、イベント引数がスクリプトエディターで使用できない場合は、これらのタイプのスクリプトの開発者がリアルタイムでログにアクセスする方法がないことを意味します。
ジェフ

1
以前はコメントできなかったので、以下の回答を提供しましたが、スクリプトエディターを開いていて、開いているスプレッドシートでイベントをトリガーした場合は、スクリプトエディターのブラウザーインスタンスに戻ってログの情報を確認できます。 。スクリプトを開くことができないユーザーまたはログインできないユーザーの下で何かをテストする必要がない限り、問題なく機能します。
Karl_S 2016

1
この回答は古く、受け入れられた回答と見なすべきではありません。Stackdriver Loggingが利用可能で、魅力のように動作します。ランダムな部分の答えを見てください!
botenvouwer 2018

34

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

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

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

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

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

Logger = BetterLog.useSpreadsheet();

1
時代遅れ。console.log()今すぐベストアンサーになるはずです
TheMaster

22

2017年の更新: Stackdriver LoggingがGoogle Apps Scriptで利用可能になりました。スクリプトエディタのメニューバーからgoto: 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 UIは、ラベルされたonEdit() Event Object出力を確認します


元の質問は特にについて尋ねていLogger.logます。console.logこれはあなたが使うものとどう違うのですか?私はツールに非常に慣れていないので、すべてが何であるかを理解しようとしています。
AnnanFay

5

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

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

js console.log('smth')では完全に機能しますが、GASではどうですか?
Igor Savinkin 2015

1
GASはスプレッドシートと同じWebページで実行されるスクリプトではないため、console.logは機能しません。それらはGoogleのアプリエンジンによって処理されるスクリプトであるため、扱いにくいLogger.logデバッガーに従うか、私のようなハックを使用する必要があります
woojoo666

配列「コンソール」はどうですか?いつI just returned consoleどのように出力しますか?
Igor Savinkin 2015

2
申し訳ありませんがよく説明しませんでしたが、基本的にスプレッドシート関数はセルに値を返します。したがって、「コンソール」を返すと、スプレッドシートセル内に記録したすべてが表示されます
woojoo666

5

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

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


5

私はこれらの投稿を試してみて、どういうわけか単純な答えを見つけました。短くて甘い解決策が欲しい人のためにここに投稿します:

  1. console.log("Hello World")スクリプトで使用します。
  2. 移動https://script.google.com/home/myとあなたのアドオンを選択します。
  3. [プロジェクトの詳細]の省略記​​号メニューをクリックし、[実行]を選択します。

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください


これは、2019年4月以降に作成されたGoogle Appsスクリプトの基本的な「Stackdriver Logging」です(これは、Appsスクリプトの背後にある「自動」プロジェクトのGoogle Cloudプロジェクトにアクセスできなくなったときです)。Apps ScriptプロジェクトのGCPを変更すると、通常のStackdriver Loggingの回答が適用されます。
テハウチ

1
ここには直接実行(つまり、スクリプトエディターで[実行]をクリックしたもの)のみが表示されますが、シート内のデータの変更による実行は表示されません。それらをデバッグするにはどうすればよいですか?
Cris70

申し訳ありませんが、まだ試していません。シートの変更が関数をトリガーし、その関数にログがある場合、ログが一緒に表示されると想像します。変更は常にユーザー主導の権利でしょうか?
ベンジャミン

1
はい、私もそれを想像していました。残念ながらそれは起こりません:-(データへの変更は関数をトリガーしますが、console.log()メッセージはStackdriverログに表示されません。変更時アクティベータを追加しようとしましたが、パラメータなしで関数を呼び出しました: -(
Cris70

4

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

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


ええ、ええ、私はこれに遭遇しました。翌朝、スクリプトから大量のエラーがメールで送られてきました。私はそれを理解することになりました(今自分の答えを投稿する)
d0c_s4vage

1

エレガントとはほど遠いですが、デバッグ中にロガーにログを記録してから、getLog()を使用してその内容をフェッチします。次に、私は次のいずれかを行います。

  • 変数に結果保存(Googleのスクリプトで検査することができ、私はいくつかのコードにブレークポイントを設定することはできません例を回避します。このデバッガが、私はすることができ、後に実行されますコードで1セット)
  • 一時的なDOM要素に書き込みます
  • アラートで表示する

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

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


1

ちょうど通知として。スプレッドシートのテスト関数を作成しました。私は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

現在、ドキュメント内でスクリプトを使用するコンテナバインドの性質に制限されています。ドキュメントの外で新しいスクリプトを作成すると、情報を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つのウィンドウを使用できます)があり、一方にはGAS環境が含まれ、もう一方にはSSが含まれているため、情報を書き込んでログを記録できます。


0

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

throw Error('hello world!');

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


0

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

...
throw whatAmI;
...

このように示しています:

ここに画像の説明を入力してください


私は、あなたがどのようにカスタム関数が示すエラー画像を示していることを言及すべきであると思いますが、OPは、彼は、単純なトリガー(使用していることに言及onEdit
ルベン・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.