2012-07-18 78 views
74

在Google表格中,您可以添加一些腳本功能。我正在爲onEdit事件添加一些內容,但我無法判斷它是否正常工作。據我所知,您無法從Google表格中調試實時事件,因此您必須從調試器中執行此操作,這是毫無意義的,因爲傳遞給我的onEdit()函數的事件參數始終未定義,如果我從Script Editor如何調試Google Apps腳本(又名Logger.log登錄到哪裏?)

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

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

如何調試這些東西?我有同樣的問題

+2

同樣的問題 - 接受的答案沒有回答,但給出了大量的明顯的錯誤信息。 – Hippyjim 2013-11-09 16:19:31

+0

看來他們現在修復了這個問題。只要您從電子表格中打開腳本編輯器,當您在工作表中運行這些內容時,請將該選項卡打開。然後返回到腳本選項卡,它將包含日誌信息。 – phreakhead 2017-01-22 02:15:35

+1

tldr;複製,粘貼並運行Logger.log('firstLog'); MailApp.sendEmail({to:'yourEmailAddressHere @ someone.com',subject:「subject here^_ ^」,body:Logger.getLog()}) ;' – 2017-05-26 16:52:19

回答

52

Logger.log將發送你已經發生在你的腳本,或者,如果你是從Script Editor運行的東西,你可以去View->Logs查看上次運行功能的記錄錯誤的電子郵件(最終)(仍在腳本編輯器中)。同樣,這隻會告訴你從內部運行的最後一個功能中記錄的任何內容。

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

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

爲了模擬編輯了一個單元格,我確實最終不得不在實際的電子表格中做些什麼。我所做的只是確保我想要它處理爲「編輯」的單元格被選中,然後在Script Editor中,我會去Run->onEdit。然後我的斷點會被擊中。

但是,我不得不停止使用傳入onEdit函數的事件參數 - 您無法通過執行Run->onEdit來模擬該事件。我需要從電子表格中獲取任何信息,例如選擇了哪個單元格等,我不得不手動弄清楚。

不管怎麼說,很長的答案,但我終於明白了。


編輯

如果你想看到的待辦事項清單,我做了,你可以check it out here

(是的,我知道任何人都可以編輯它 - 這是共享的地步! )

我希望它能讓你看到腳本。既然你不能看到它在那裏,那就是:

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

Pff,只有在郵件中才能看到日誌記錄?這樣做會使所有這些調試和日誌功能無用,因爲我們無法使用電子表格中的實際數據。 – MrFox 2013-07-25 14:30:23

+0

否。正如作者所說,可以在日誌中使用日誌(腳本編輯器,查看,日誌或Ctrl-Enter) – rainabba 2013-10-10 11:39:00

+6

@rainabba是,可以在腳本編輯器中進行日誌記錄。但是,當腳本依賴於事件參數且事件參數在腳本編輯器中不可用時,它實際上意味着這些類型的腳本的開發人員沒有實時訪問日誌的方式。 – Jeff 2014-02-12 15:32:43

3

,我發現下面的網站上的某個地方....

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

+0

嗯,是的,我遇到了這個問題 - 它在第二天早上通過我的腳本發送了一大堆錯誤。我確實最終找出了它(現在發佈我自己的答案) – 2012-08-07 14:29:15

4

有點哈克,但我創建了一個名爲「控制檯」的數組,只要我想輸出到控制檯我推到陣列。然後每當我想看到實際的輸出時,我只是返回console而不是我以前返回的任何東西。

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

完美地工作,但在GAS中怎麼樣? – 2015-04-03 09:13:18

+1

console.log不會工作,因爲GAS不是與電子表格在同一網頁上運行的腳本,它們是由Google的應用引擎處理的腳本,因此您必須遵循笨重的Logger.log調試器或使用像我一樣的破解 – woojoo666 2015-04-03 22:43:25

+0

你的陣列'控制檯'怎麼樣?當我剛剛返回控制檯時,你如何輸出它? – 2015-04-04 05:44:56

25

據我所知,你不能調試從谷歌文檔現場活動,所以你必須從調試器,因爲事件參數傳遞給我的onEdit這是毫無意義的做到這一點( )如果我從腳本編輯器運行它,它總是未定義的。

確實 - 所以自己定義事件參數以進行調試。見How can I test a trigger function in GAS?

我試圖使用Logger.log方法來記錄一些數據時,只要onEdit函數被調用,而這也似乎是它只能從腳本編輯器中運行時的工作原理。當我從腳本編輯器運行它時,我可以通過查看 - >日誌查看日誌...

真的,但有幫助。 Peter Hermann的BetterLog library將所有日誌重定向到電子表格,甚至可以從未附加到編輯器/調試器實例的代碼記錄日誌。

例如,如果您使用電子表格包含的腳本編寫代碼,則只需將這一行添加到腳本文件的頂部,並且所有日誌都將轉到電子表格中的「日誌」表單。沒有必要的其他代碼,只需使用Logger.log()就象你通常:

Logger = BetterLog.useSpreadsheet(); 
+4

這應該被標記爲正確的答案! – Jpsy 2016-02-04 15:54:08

0

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

例如,在你的第一個代碼塊

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工作,我有兩個顯示器(你可以使用兩個窗口)設置與含有氣體的環境中,另一個包含了一個SS所以我可以寫信息並登錄。

+0

不清楚,什麼是SS?如何啓用它? – 2015-04-03 09:05:49

+0

SS是電子表格 – JForgie 2015-05-26 04:00:25

1

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

  • 將結果保存到一個變量(可以在谷歌的腳本進行檢查調試器,它解決,我不能在一些代碼中設置斷點的情況,但我可以集一個在代碼被執行後)
  • 其寫入一些臨時DOM元素
  • 顯示它在alert

從本質上講,它只是成爲一個JavaScript output問題。

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

0

就像一個通知。我爲我的電子表格做了一個測試功能。我在onEdit(e)函數中使用google拋出的變量(我稱之爲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

4

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

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

2

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 ObjectStackdriver UI日誌查看輸出

0

dev的控制檯將記錄錯誤由應用程序腳本拋出,所以你可以拋出一個錯誤,讓它作爲一個正常的conso記錄le.log。它會停止執行,但它對逐步調試仍然有用。

throw Error('hello world!'); 

將在控制檯中同樣出現在這裏console.log('hello world')