google-apps-script script - 如何調試Google Apps腳本(又名Logger.log登錄到哪裡?)




api spreadsheet (9)

Logger.log將向您發送(最終)發生在您的腳本中的錯誤的電子郵件,或者,如果您正在從Script Editor運行某些內容,則可以通過查看View->Logs查看上次運行功能中的View->Logs (仍然在腳本編輯器中)。 再次,這只會顯示Script Editor運行的最後一個函數記錄的任何內容。

我試圖使用的腳本與電子表格有關 - 我製作了一個電子表格待辦事項清單類型的東西,按優先順序排序項目等。

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

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

但是,我不得不停止使用傳入onEdit函數的事件參數 - 您無法通過執行Run->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表格中,您可以添加一些腳本功能。 我為onEdit事件添加了一些內容,但我無法確定它是否正常工作。 據我所知,您無法從Google表格中調試實時事件,因此您必須從調試器中執行該操作,這是毫無意義的,因為如果我運行的話,傳遞給我的onEdit()函數的事件參數將始終未定義它來自Script Editor

所以,我試圖使用Logger.log方法在onEdit函數被調用時記錄一些數據,但是這也似乎只在從Script Editor運行時才起作用。 當我從Script Editor運行它時,我可以通過查看View->Logs...查看View->Logs...

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

我如何調試這些東西?


有點不好意思,但我創建了一個名為“console”的數組,並且任何時候我想輸出到控制台時,我都會推送到數組。 然後,每當我想看到實際的輸出時,我只是返回console而不是之前返回的任何內容。

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

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

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

實質上,它只是成為一個JavaScript輸出問題。

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


開發者控制台會記錄應用程序腳本拋出的錯誤,所以你可以拋出一個錯誤來讓它作為一個普通的console.log被記錄下來。 它會停止執行,但它對逐步調試仍然有用。

throw Error('hello world!');

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


如果您打開腳本編輯器,您將在查看 - >日誌下看到日誌。 如果您的腳本有觸發器觸發器,請更改電子表格,該觸發器將在第二個選項卡中打開腳本編輯器的情況下觸發該功能。 然後轉到腳本編輯器選項卡並打開日誌。 你會看到你的函數傳遞給記錄器。

基本上只要腳本編輯器處於打開狀態,事件就會寫入日誌並顯示給您。 它不會顯示其他人是否在其他文件中。


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

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


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 UI中的日誌以查看輸出


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

例如在你的第一個代碼塊

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


這個問題已在其他地方得到了回答。 以下是摘要:

布魯斯麥克弗森

basic authentication looks like this...
    var options = {};
    options.headers = {"Authorization": "Basic " + Utilities.base64Encode(username + ":" + password)};

萊尼坎寧安

//Added Basic Authorization//////////////////////////////////////////////////////////////////////////////////////////

  var USERNAME = PropertiesService.getScriptProperties().getProperty('username');
  var PASSWORD = PropertiesService.getScriptProperties().getProperty('password');

  var url = PropertiesService.getScriptProperties().getProperty('url');//////////////////////////Forwarded

到WebRelay的端口

  var headers = {
    "Authorization" : "Basic " + Utilities.base64Encode(USERNAME + ':' + PASSWORD)
  };

  var params = {
    "method":"GET",
    "headers":headers
  };

var reponse = UrlFetchApp.fetch(url, params);






google-apps-script google-spreadsheet