簡體   English   中英

如何調試 Google Apps 腳本(也就是 Logger.log 記錄到哪里?)

[英]How to debug Google Apps Script (aka where does Logger.log log to?)

在 Google 表格中,您可以添加一些腳本功能。 我正在為onEdit事件添加一些內容,但我無法判斷它是否有效。 據我所知,您無法從 Google 表格調試實時事件,因此您必須從調試器進行調試,這是沒有意義的,因為如果我運行,傳遞給我的onEdit() function 的事件參數將始終未定義它來自Script Editor

因此,每當調用onEdit function 時,我都嘗試使用Logger.log方法記錄一些數據,但這似乎也只有在從Script Editor運行時才有效。 當我從Script Editor運行它時,我可以通過轉到View->Logs...查看日志

我希望我能夠看到事件實際執行時的日志,但我無法弄清楚。

我該如何調試這些東西?

更新:

正如這個答案中所寫,


Logger.log會(最終)向您發送一封電子郵件,告知您腳本中發生的錯誤,或者,如果您正在從Script Editor運行內容,您可以通過轉到查看View->Logs (仍在腳本編輯器中)。 同樣,這只會向您顯示您Script Editor中運行的最后一個函數記錄的任何內容。

我試圖開始工作的腳本與電子表格有關——我制作了一個電子表格待辦事項清單類型的東西,它按優先級等對項目進行排序。

我為該腳本安裝的唯一觸發器是 onOpen 和 onEdit 觸發器。 調試 onEdit 觸發器是最難搞清楚的,因為我一直在想,如果我在我的 onEdit 函數中設置一個斷點,打開電子表格,編輯一個單元格,我的斷點就會被觸發。 不是這種情況。

為了模擬編輯一個單元格,最終不得不在實際的電子表格中做一些事情。 我所做的只是確保選中我希望它視為“已編輯”的單元格,然后在Script Editor中,我將轉到Run->onEdit 然后我的斷點就會被擊中。

但是,我確實不得不停止使用傳遞給 onEdit 函數的事件參數——你不能通過執行Run->onEdit來模擬它。 我需要從電子表格中獲得的任何信息,例如選擇了哪個單元格等,我都必須手動弄清楚。

無論如何,答案很長,但我最終想通了。


編輯

如果你想看我做的待辦事項清單,你可以在這里查看

(是的,我知道任何人都可以編輯它——這就是分享它的意義所在!)

我希望它也能讓你看到劇本。 由於您在那里看不到它,因此它是:

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();
};

據我所知,您無法從 google docs 調試實時事件,因此您必須從調試器進行調試,這是沒有意義的,因為如果我運行,傳遞給我的 onEdit() 函數的事件參數將始終未定義它來自腳本編輯器。

是的 - 所以自己定義事件參數以進行調試。 請參閱如何在 GAS 中測試觸發功能?

每當調用 onEdit 函數時,我都嘗試使用 Logger.log 方法記錄一些數據,但這似乎也只有在從腳本編輯器運行時才有效。 當我從腳本編輯器運行它時,我可以通過轉到“查看”->“日志...”來查看日志。

再次正確,但有幫助。 Peter Hermann 的BetterLog 庫會將所有日志重定向到電子表格,甚至可以從未附加到編輯器/調試器實例的代碼中進行日志記錄。

例如,如果您在包含電子表格的腳本中進行編碼,則可以僅將這一行添加到腳本文件的頂部,所有日志都將轉到電子表格中的“日志”表。 不需要其他代碼,只需像往常一樣使用Logger.log()

Logger = BetterLog.useSpreadsheet();

2017 年更新: Stackdriver Logging現在可用於 Google Apps 腳本。 在腳本編輯器的菜單欄中,轉到: 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});
}

然后檢查標記為onEdit() Event Object的 Stackdriver UI中的日志以查看輸出

我瀏覽了這些帖子,最終以某種方式找到了一個簡單的答案,我將其發布在這里,以供那些想要簡短而貼心的解決方案的人使用:

  1. 在腳本中使用console.log("Hello World")
  2. 轉到https://script.google.com/home/my並選擇您的附加組件。
  3. 單擊項目詳細信息上的省略號菜單,選擇執行。

在此處輸入圖像描述

  1. 單擊最新執行的標題並閱讀日志。

在此處輸入圖像描述

有點 hacky,但我創建了一個名為“console”的數組,每當我想輸出到控制台時,我都會將其推送到該數組。 然后,每當我想查看實際輸出時,我只返回console ,而不是之前返回的任何內容。

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

如果您打開了腳本編輯器,您將在“查看”->“日志”下看到日志。 如果您的腳本有 onedit 觸發器,請使用在第二個選項卡中打開的腳本編輯器對應該觸發該功能的電子表格進行更改。 然后轉到腳本編輯器選項卡並打開日志。 您將看到您的函數傳遞給記錄器的任何內容。

基本上只要打開腳本編輯器,事件就會寫入日志並顯示給您。 它不會顯示其他人是否在其他地方的文件中。

我有同樣的問題,我在網上的某個地方找到了下面的......

Docs 中的事件處理程序雖然有點棘手。 因為文檔可以處理多個用戶同時進行的多個編輯,所以事件處理程序是在服務器端處理的。 這種結構的主要問題是,當事件觸發腳本失敗時,它會在服務器上失敗。 如果您想查看調試信息,您需要在觸發器菜單下設置一個顯式觸發器,當事件失敗時通過電子郵件向您發送調試信息,否則它會靜默失敗。

它遠非優雅,但在調試時,我經常登錄到 Logger,然后使用getLog()獲取其內容。 然后,我要么:

  • 將結果保存到一個變量(可以在 Google Scripts 調試器中檢查——這適用於我無法在某些代碼中設置斷點,但我可以在稍后執行的代碼中設置斷點的情況)
  • 將其寫入某個臨時 DOM 元素
  • 警報中顯示

本質上,它只是一個JavaScript 輸出問題。

它嚴重缺乏現代console.log()實現的功能,但 Logger 仍然有助於調試 Google 腳本。

就像一個通知。 我為我的電子表格做了一個測試函數。 我在 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:有關谷歌為函數提供的更多變量,請訪問此處: https ://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

目前,您僅限於在文檔中使用腳本的容器綁定特性。 如果您在文檔之外的內部創建一個新腳本,那么您將能夠將信息導出到谷歌電子表格並將其用作日志記錄工具。

例如在您的第一個代碼塊中

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,因此我可以將信息寫入和記錄。

開發控制台將記錄應用腳本拋出的錯誤,因此您只需拋出一個錯誤即可將其記錄為普通的 console.log。 它會停止執行,但它可能仍然對逐步調試有用。

throw Error('hello world!');

將類似於console.log('hello world')顯示在控制台中

對於綁定到單個工作表(或文檔)的 Apps 腳本項目——在 2022 年——沒有其他答案建議的View菜單。 相反,您需要查看左側邊欄的Executions菜單以查看您的onSelectionChange function(或任何其他函數)的執行,您可以從那里單擊REFRESH ,直到出現您的console.log消息。 在此處輸入圖像描述

只需像這樣調試電子表格代碼:

...
throw whatAmI;
...

顯示如下:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM