Làm cách nào để gỡ lỗi Google Apps Script (còn gọi là Logger.log đăng nhập vào đâu?)


129

Trong Google Sheets, bạn có thể thêm một số chức năng tập lệnh. Tôi đang thêm một cái gì đó cho onEditsự kiện này, nhưng tôi không thể biết nó có hoạt động không. Theo như tôi có thể nói, bạn không thể gỡ lỗi một sự kiện trực tiếp từ Google Sheets, vì vậy bạn phải thực hiện nó từ trình gỡ lỗi, điều này là vô nghĩa vì đối số sự kiện được truyền cho onEdit()hàm của tôi sẽ luôn không được xác định nếu tôi chạy nó từ Script Editor.

Vì vậy, tôi đã cố gắng sử dụng Logger.logphương thức để ghi lại một số dữ liệu bất cứ khi nào onEdithàm được gọi, nhưng điều này cũng có vẻ như nó chỉ hoạt động khi chạy từ Script Editor. Khi tôi chạy nó từ Script Editor, tôi có thể xem nhật ký bằng cách đi đếnView->Logs...

Tôi đã hy vọng tôi có thể xem nhật ký từ khi sự kiện thực sự được thực hiện, nhưng tôi không thể tìm ra nó.

Làm thế nào để tôi gỡ lỗi công cụ này?


3
Vấn đề tương tự ở đây - câu trả lời được chấp nhận không trả lời nhưng cung cấp nhiều thông tin sai.
Hippyjim

Có vẻ như họ đã sửa lỗi này ngay bây giờ. Miễn là bạn mở Script Editor từ bảng tính của mình, hãy để tab đó mở khi bạn chạy nội dung trong Trang tính của mình. Sau đó quay lại tab script và nó sẽ có thông tin Logging trong đó.
phreakhead

2
tldr; sao chép, dán và chạyLogger.log('firstLog');MailApp.sendEmail({to:'yourEmailAddressHere@someone.com',subject: "subject here ^_^",body: Logger.getLog()});
Coty Embry

Maby bạn nên thay đổi câu trả lời được chấp nhận hoặc thêm một lưu ý rằng Ghi nhật ký Stackdo có sẵn.
botenvouwer

Câu trả lời:


83

CẬP NHẬT:

Như được viết trong câu trả lời này ,


Logger.logsẽ gửi cho bạn một email (cuối cùng) các lỗi đã xảy ra trong tập lệnh của bạn hoặc, nếu bạn đang chạy mọi thứ từ Script Editor, bạn có thể xem nhật ký từ chức năng chạy cuối cùng bằng cách đi tới View->Logs(vẫn trong trình chỉnh sửa tập lệnh). Một lần nữa, điều đó sẽ chỉ cho bạn thấy bất cứ điều gì đã được ghi lại từ chức năng cuối cùng bạn chạy từ bên trongScript Editor .

Kịch bản tôi đang cố gắng để làm việc phải thực hiện với bảng tính - Tôi đã tạo một loại bảng liệt kê danh sách kiểm tra việc sắp xếp các mục theo thứ tự ưu tiên và như vậy.

Các kích hoạt duy nhất tôi đã cài đặt cho tập lệnh đó là các kích hoạt onOpen và onEdit. Gỡ lỗi trình kích hoạt onEdit là cách khó nhất để tìm ra, bởi vì tôi cứ nghĩ rằng nếu tôi đặt điểm dừng trong hàm onEdit, hãy mở bảng tính, chỉnh sửa một ô, rằng điểm dừng của tôi sẽ được kích hoạt. Đây không phải là trường hợp.

Để mô phỏng việc chỉnh sửa một ô, cuối cùng tôi đã phải làm một cái gì đó trong bảng tính thực tế. Tất cả những gì tôi đã làm là đảm bảo ô mà tôi muốn nó coi là "đã chỉnh sửa" đã được chọn, sau đó Script Editor, tôi sẽ đi đếnRun->onEdit . Sau đó, điểm dừng của tôi sẽ được nhấn.

Tuy nhiên, tôi đã phải ngừng sử dụng đối số sự kiện được truyền vào hàm onEdit - bạn không thể mô phỏng điều đó bằng cách thực hiện Run->onEdit . Bất kỳ thông tin nào tôi cần từ bảng tính, như ô nào được chọn, v.v., tôi phải tìm ra bằng tay.

Dù sao, câu trả lời dài, nhưng cuối cùng tôi đã tìm ra nó.


BIÊN TẬP :

Nếu bạn muốn xem danh sách kiểm tra việc cần làm tôi đã thực hiện, bạn có thể xem tại đây

(vâng, tôi biết bất cứ ai cũng có thể chỉnh sửa nó - đó là điểm chia sẻ nó!)

Tôi đã hy vọng nó sẽ cho bạn xem kịch bản là tốt. Vì bạn không thể nhìn thấy nó ở đó, đây là:

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, đăng nhập sẽ chỉ được hiển thị trong thư? Điều đó làm cho tất cả các tính năng gỡ lỗi và ghi nhật ký trở nên vô dụng, bởi vì chúng tôi không thể sử dụng dữ liệu thực từ bảng tính.
MrFox

Như tác giả đã nói, ghi nhật ký có sẵn trong nhật ký (Trình chỉnh sửa tập lệnh, Chế độ xem, Nhật ký hoặc Ctrl-Enter)
rainabba

9
@rainabba Có, đăng nhập có sẵn trong Trình chỉnh sửa tập lệnh. Tuy nhiên, khi tập lệnh phụ thuộc vào đối số sự kiện và đối số sự kiện không có sẵn trong Trình chỉnh sửa tập lệnh, điều đó có nghĩa là các nhà phát triển của các loại tập lệnh này không có cách truy cập nhật ký theo thời gian thực.
Jeff

1
Tôi không thể nhận xét trước, vì vậy tôi đã chứng minh câu trả lời bên dưới, nhưng: NẾU bạn mở trình chỉnh sửa tập lệnh và BẠN kích hoạt một sự kiện trong bảng tính mở, bạn có thể quay lại phiên bản trình duyệt trình chỉnh sửa tập lệnh và xem thông tin trong Nhật ký . Nó hoạt động tốt miễn là bạn không phải kiểm tra thứ gì đó theo người dùng không thể mở tập lệnh hoặc người dùng bạn không thể đăng nhập.
Karl_S

1
Câu trả lời này đã lỗi thời và không nên được xem là câu trả lời được chấp nhận. Stackdo Logging có sẵn và hoạt động như một nét duyên dáng. Hãy xem câu trả lời ngẫu nhiên!
botenvouwer

34

Theo như tôi có thể nói, bạn không thể gỡ lỗi một sự kiện trực tiếp từ tài liệu google, vì vậy bạn phải làm điều đó từ trình gỡ lỗi, điều này là vô nghĩa vì đối số sự kiện được truyền cho hàm onEdit () của tôi sẽ luôn không được xác định nếu tôi chạy nó từ Trình chỉnh sửa tập lệnh.

Đúng - vì vậy hãy tự xác định đối số sự kiện để gỡ lỗi. Xem Làm thế nào tôi có thể kiểm tra chức năng kích hoạt trong GAS?

Tôi đã cố gắng sử dụng phương thức Logger.log để ghi lại một số dữ liệu bất cứ khi nào hàm onEdit được gọi, nhưng điều này cũng có vẻ như nó chỉ hoạt động khi chạy từ Trình chỉnh sửa tập lệnh. Khi tôi chạy nó từ Trình chỉnh sửa tập lệnh, tôi có thể xem nhật ký bằng cách vào Xem-> Nhật ký ...

Đúng một lần nữa, nhưng có sự giúp đỡ. Thư viện BetterLog của Peter Hermann sẽ chuyển hướng tất cả các bản ghi sang bảng tính, cho phép ghi nhật ký ngay cả từ mã không được đính kèm với phiên bản của trình soạn thảo / trình gỡ lỗi.

Ví dụ: nếu bạn đang mã hóa trong tập lệnh chứa bảng tính, bạn chỉ có thể thêm một dòng này vào đầu tệp tập lệnh của mình và tất cả các nhật ký sẽ chuyển đến trang tính "Nhật ký" trong bảng tính. Không cần mã khác, chỉ cần sử dụng Logger.log()như bạn thường làm:

Logger = BetterLog.useSpreadsheet();

1
Đã lỗi thời. console.log()nên là câu trả lời tốt nhất bây giờ
TheMaster

22

Cập nhật 2017: Ghi nhật ký Stackdo hiện có sẵn cho Google Apps Script. Từ thanh menu trong trình chỉnh sửa tập lệnh, goto: View > Stackdriver Loggingđể xem hoặc truyền phát nhật ký.

console.log () sẽ viếtDEBUG thông báo mức

Ví dụ onEdit()đăng nhập:

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

Sau đó kiểm tra các bản ghi trong Giao diện người dùng Stackdo có nhãn onEdit() Event Objectđể xem đầu ra


Các câu hỏi ban đầu đặc biệt hỏi về Logger.log. Điều này khác với console.lognhững gì bạn sử dụng? Tôi còn rất mới với các công cụ nên chỉ cố gắng tìm hiểu mọi thứ là gì.
AnnanFay

5

Một chút hacky, nhưng tôi đã tạo ra một mảng gọi là "console" và bất cứ khi nào tôi muốn xuất ra console tôi đều đẩy sang mảng. Sau đó, bất cứ khi nào tôi muốn xem đầu ra thực tế, tôi chỉ quay lại consolethay vì bất cứ điều gì tôi đã trở lại trước đó.

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

trong js console.log('smth')hoạt động hoàn hảo, nhưng trong GAS thì sao?
Igor Savinkin

1
console.log sẽ không hoạt động đơn giản vì GAS không phải là các tập lệnh chạy trong cùng một trang web với bảng tính của bạn, chúng là các tập lệnh được xử lý bởi công cụ ứng dụng của google, do đó bạn phải theo dõi trình gỡ lỗi Logger.log khó sử dụng của chúng hoặc sử dụng hack như của tôi
woojoo666

Làm thế nào về mảng 'console' của bạn? Khi I just returned consolenào bạn xuất nó?
Igor Savinkin

2
Xin lỗi tôi đã không giải thích rất rõ, nhưng về cơ bản, các hàm bảng tính trả về giá trị cho ô, vì vậy nếu bạn trả lại "bảng điều khiển" của mình, bạn sẽ thấy mọi thứ bạn đã đăng nhập bên trong ô bảng tính của mình
woojoo666

5

Nếu bạn mở trình chỉnh sửa tập lệnh, bạn sẽ thấy các bản ghi trong phần Xem-> Nhật ký. Nếu tập lệnh của bạn có trình kích hoạt onedit, hãy thay đổi bảng tính sẽ kích hoạt chức năng với trình chỉnh sửa tập lệnh được mở trong tab thứ hai. Sau đó chuyển đến tab soạn thảo tập lệnh và mở nhật ký. Bạn sẽ thấy bất cứ điều gì chức năng của bạn chuyển đến logger.

Về cơ bản miễn là trình soạn thảo kịch bản được mở, sự kiện sẽ ghi vào nhật ký và hiển thị nó cho bạn. Nó sẽ không hiển thị nếu có người khác ở trong tệp ở nơi khác.


5

Tôi đã xem qua những bài đăng này và bằng cách nào đó cuối cùng tôi đã tìm thấy một câu trả lời đơn giản, mà tôi đang đăng ở đây cho những người muốn giải pháp ngắn gọn và ngọt ngào:

  1. Sử dụng console.log("Hello World")trong kịch bản của bạn.
  2. Tới https://script.google.com/home/my và chọn tiện ích bổ sung của bạn.
  3. Nhấp vào menu dấu chấm lửng trên Chi tiết dự án, chọn Thực thi.

nhập mô tả hình ảnh ở đây

  1. Nhấp vào tiêu đề của thực hiện mới nhất và đọc nhật ký.

nhập mô tả hình ảnh ở đây


Đây là "Nhật ký ngăn xếp" cơ bản cho Tập lệnh Google Apps được tạo sau tháng 4 năm 2019 (đó là khi việc truy cập Google Cloud Project cho các dự án "tự động" đằng sau Tập lệnh ứng dụng trở nên không thể). Nếu bạn thay đổi GCP cho dự án Tập lệnh ứng dụng, thì câu trả lời ghi nhật ký Stackdo thông thường sẽ được áp dụng.
tehhowch

1
Tôi chỉ thấy các thực thi trực tiếp ở đây (tức là những lần tôi đã bấm "chạy" trong trình chỉnh sửa tập lệnh), nhưng tôi không thấy các thực thi gây ra do thay đổi dữ liệu trong trang tính. Làm thế nào để tôi gỡ lỗi những?
Cris70

Tôi đã không thử điều đó xin lỗi. Tôi sẽ tưởng tượng rằng nếu một thay đổi trong trang tính kích hoạt một chức năng và chức năng có một bản ghi, nhật ký sẽ hiển thị cùng. Thay đổi sẽ luôn do người dùng gây ra phải không?
Benjamin

1
Vâng, tôi cũng sẽ tưởng tượng điều đó. Đáng tiếc đó không phải là điều xảy ra :-( Thay đổi dữ liệu sẽ kích hoạt chức năng của tôi, nhưng các thông báo console.log () không được hiển thị trong nhật ký Stackdo. Tôi đã thử thêm trình kích hoạt thay đổi, nhưng nó gọi hàm của tôi mà không có tham số: - (
Cris70

4

Tôi đang gặp vấn đề tương tự, tôi tìm thấy bên dưới trên web ở đâu đó ....

Trình xử lý sự kiện trong Docs có một chút khó khăn. Vì các tài liệu có thể xử lý nhiều chỉnh sửa đồng thời bởi nhiều người dùng, nên các trình xử lý sự kiện được xử lý phía máy chủ. Vấn đề chính với cấu trúc này là khi một kịch bản kích hoạt sự kiện bị lỗi, nó sẽ bị lỗi trên máy chủ. Nếu bạn muốn xem thông tin gỡ lỗi, bạn sẽ cần thiết lập trình kích hoạt rõ ràng trong menu kích hoạt gửi email cho bạn thông tin gỡ lỗi khi sự kiện không thành công nếu không nó sẽ thất bại trong âm thầm.


Hmm, yeah, tôi đã gặp phải điều này - nó đã gửi email cho tôi cả đống lỗi từ các kịch bản của tôi vào sáng hôm sau. Cuối cùng tôi đã tìm ra nó (đăng câu trả lời của riêng tôi bây giờ)
d0c_s4vage

1

Nó khác xa so với thanh lịch, nhưng trong khi gỡ lỗi, tôi thường đăng nhập vào Logger và sau đó sử dụng getLog () để lấy nội dung của nó. Sau đó, tôi cũng:

  • lưu kết quả vào một biến (có thể được kiểm tra trong trình gỡ lỗi Google ScScript, điều này hoạt động xung quanh các trường hợp tôi không thể đặt điểm dừng trong một số mã, nhưng tôi có thể đặt mã trong mã được thực thi sau)
  • ghi nó vào một số phần tử DOM tạm thời
  • hiển thị nó trong một cảnh báo

Về cơ bản, nó chỉ trở thành một vấn đề đầu ra JavaScript .

Nó hoàn toàn thiếu chức năng của các console.log()triển khai hiện đại , nhưng Logger vẫn giúp gỡ lỗi Google ScScript.


1

Chỉ là một thông báo. Tôi đã thực hiện một chức năng kiểm tra cho bảng tính của tôi. Tôi sử dụng biến google ném trong hàm onEdit (e) (tôi gọi nó là e). Sau đó, tôi đã thực hiện một chức năng kiểm tra như thế này:

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

Gọi hàm kiểm tra này làm cho tất cả các mã chạy như bạn đã có một sự kiện trong bảng tính. Tôi vừa mới sở hữu ô mà tôi đã chỉnh sửa đã cho tôi một kết quả không mong muốn, đặt giá trị là giá trị tôi đặt vào ô. OBS! để biết thêm các biến mà googles cung cấp cho hàm, hãy truy cập vào đây: https://developers.google.com/apps-script/guides/triggers/events#google_sheet_events


0

Hiện tại bạn bị giới hạn trong tính chất ràng buộc của bộ chứa trong việc sử dụng tập lệnh trong tài liệu. Nếu bạn tạo một tập lệnh mới bên trong bên ngoài các tài liệu thì bạn sẽ có thể xuất thông tin sang bảng tính google và sử dụng nó như một công cụ ghi nhật ký.

Ví dụ: trong khối mã đầu tiên của bạn

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

Khi tôi làm việc với GAS, tôi có hai màn hình (bạn có thể sử dụng hai cửa sổ) được thiết lập với một màn hình chứa môi trường GAS và cửa sổ kia chứa SS để tôi có thể ghi thông tin và đăng nhập.


0

Bảng điều khiển dev sẽ ghi lại các lỗi được ném bởi tập lệnh ứng dụng, vì vậy bạn chỉ cần đưa ra một lỗi để nó được ghi lại như một console.log bình thường. Nó sẽ dừng thực thi, nhưng nó vẫn có thể hữu ích cho từng bước gỡ lỗi.

throw Error('hello world!');

sẽ hiển thị trong bảng điều khiển tương tự như console.log('hello world')


0

chỉ cần gỡ lỗi mã bảng tính của bạn như thế này:

...
throw whatAmI;
...

cho thấy như thế này:

nhập mô tả hình ảnh ở đây


Tôi nghĩ rằng bạn nên đề cập rằng hình ảnh cho thấy cách một chức năng tùy chỉnh hiển thị lỗi nhưng OP đề cập rằng anh ta đang sử dụng một trình kích hoạt đơn giản ( onEdit)
Rubén
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.