Google Apps Script를 디버깅하는 방법 (일명 Logger.log는 어디에 기록됩니까?)


129

Google 스프레드 시트에서 일부 스크립팅 기능을 추가 할 수 있습니다. onEdit이벤트를 위해 무언가를 추가하고 있지만 이벤트가 작동하는지 알 수 없습니다. 내가 알 수있는 한 Google 스프레드 시트에서 라이브 이벤트를 디버깅 할 수 없으므로 디버거에서 수행해야합니다. 디버거에서 수행해야합니다. 내 onEdit()함수에 전달 된 이벤트 인수가 이벤트 에서 실행되면 항상 정의되지 않기 때문에 의미가 없습니다. Script Editor.

그래서 함수를 호출 Logger.log할 때마다 메소드 를 사용하여 일부 데이터를 기록 하려고 시도 onEdit했지만 이것도에서 실행될 때만 작동하는 것처럼 보입니다 Script Editor. 에서 실행하면 Script Editor로 이동하여 로그를 볼 수 있습니다View->Logs...

이벤트가 실제로 실행될 때의 로그를 볼 수 있기를 바랐지만 이해할 수 없었습니다.

이 물건을 어떻게 디버깅합니까?


3
동일한 문제가 있습니다-허용 된 답변은 대답하지 않지만 많은 일반 정보를 제공합니다.
Hippyjim

그들은 지금 이것을 고친 것 같습니다. 스프레드 시트에서 스크립트 편집기를 열면 시트에서 항목을 실행할 때 해당 탭을 열어 두십시오. 그런 다음 스크립트 탭으로 돌아가서 로깅 정보가 표시됩니다.
phreakhead

2
tldr; 복사, 붙여 넣기 및 실행Logger.log('firstLog');MailApp.sendEmail({to:'yourEmailAddressHere@someone.com',subject: "subject here ^_^",body: Logger.getLog()});
코티 엠브리에게

Maby 허용 된 답변을 변경하거나 Stackdriver Logging을 사용할 수 있다는 메모를 추가해야합니다.
botenvouwer

답변:


83

최신 정보:

답변에 쓰여진 것처럼


Logger.log스크립트에서 발생한 오류에 대한 전자 메일을 보내거나 (또는 ​​최종적으로)에서 실행중인 경우 (아직 스크립트 편집기에서) Script Editor로 이동하여 마지막 실행 기능의 로그를 볼 수 있습니다 View->Logs. 다시 말하지만, 내부에서Script Editor 마지막으로 실행 함수에서 기록 된 내용 만 표시 됩니다 .

내가 작업하려고했던 스크립트는 스프레드 시트와 관련이 있습니다. 우선 순위와 항목별로 항목을 정렬하는 스프레드 시트 todo-checklist 유형을 만들었습니다.

해당 스크립트에 대해 설치 한 유일한 트리거는 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();
};

Pff, 로깅은 메일에서만 볼 수 있습니까? 스프레드 시트에서 실제 데이터를 효과적으로 사용할 수 없기 때문에 이러한 디버깅 및 로깅 기능을 모두 쓸모 없게 만듭니다.
MrFox

저자가 말했듯이 로깅은 로그 (스크립트 편집기,보기, 로그 또는 Ctrl-Enter)에서 사용할 수 있습니다
rainabba

9
@rainabba 예, 스크립트 편집기에서 로깅을 사용할 수 있습니다. 그러나 스크립트가 이벤트 인수에 의존하고 스크립트 편집기에서 이벤트 인수를 사용할 수없는 경우 이러한 유형의 스크립트 개발자가 실시간으로 로그에 액세스 할 수있는 방법이 없음을 의미합니다.
Jeff

1
전에는 언급 할 수 없었으므로 아래 답변을 제공했지만 스크립트 편집기가 열려 있고 열린 스프레드 시트에서 이벤트를 트리거하면 스크립트 편집기 브라우저 인스턴스로 돌아가서 로그의 정보를 볼 수 있습니다. . 스크립트를 열 수없는 사용자 나 로그인 할 수없는 사용자에서 무언가를 테스트 할 필요가없는 한 잘 작동합니다.
Karl_S

1
이 답변은 구식이므로 허용되는 답변으로 보아서는 안됩니다. Stackdriver Logging을 사용할 수 있으며 매력처럼 작동합니다. 임의 부분 답변을 살펴보십시오!
botenvouwer

34

내가 알 수있는 한, Google 문서에서 라이브 이벤트를 디버깅 할 수 없으므로 디버거에서 수행해야합니다. 내 onEdit () 함수에 전달 된 이벤트 인수가 실행되면 항상 정의되지 않기 때문에 의미가 없습니다. 스크립트 편집기에서

참-디버깅을 위해 이벤트 인수를 직접 정의하십시오. GAS에서 트리거 기능을 테스트하는 방법을 참조하십시오 .

onEdit 함수가 호출 될 때마다 Logger.log 메서드를 사용하여 일부 데이터를 기록하려고했지만 스크립트 편집기에서 실행할 때만 작동하는 것처럼 보입니다. 스크립트 편집기에서 실행할 때 View-> Logs ...로 이동하여 로그를 볼 수 있습니다.

다시 사실이지만 도움이 있습니다. Peter Hermann의 BetterLog 라이브러리 는 모든 로그를 스프레드 시트로 리디렉션하여 편집기 / 디버거의 인스턴스에 첨부되지 않은 코드에서도 로깅을 가능하게합니다.

예를 들어 스프레드 시트가 포함 된 스크립트로 코딩하는 경우이 한 줄만 스크립트 파일의 맨 위에 추가하면 모든 로그가 스프레드 시트의 "로그"시트로 이동합니다. 다른 코드는 필요하지 않습니다 Logger.log(). 평소와 같이 사용하십시오 .

Logger = BetterLog.useSpreadsheet();

1
시대에 뒤쳐진. console.log()최고의 답변이 될 것입니다
TheMaster

22

2017 업데이트 : 이제 Google Apps Script에 Stackdriver Logging을 사용할 수 있습니다. 스크립트 편집기의 메뉴 표시 줄에서로 이동 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"이라는 배열을 만들었고 언제든지 콘솔에 출력하고 싶을 때 배열로 푸시했습니다. 그런 다음 실제 출력을보고 싶을 때마다 console이전에 반환 한 것이 아닌 방금 반환 했습니다.

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

js에서 console.log('smth')완벽하게 작동하지만 GAS는 어떻습니까?
Igor Savinkin

1
가스 스프레드 시트와 같은 웹 페이지에서 실행되는 스크립트는 당신이 그들의 다루기 힘든 Logger.log 디버거를 따르거나 내 같은 해킹을 사용 그래서, 그들은 구글의 앱 엔진에 의해 처리 스크립트되어 있지 않기 때문에 CONSOLE.LOG 단순히 작동하지 않습니다
woojoo666을

배열 '콘솔'은 어떻습니까? 언제 I just returned console출력합니까?
Igor Savinkin

2
잘 설명하지 못했지만 기본적으로 스프레드 시트 함수는 셀에 값을 반환하므로 "콘솔"을 반환하면 스프레드 시트 셀에 기록 된 모든 내용을 볼 수 있습니다
woojoo666

5

스크립트 편집기가 열려 있으면보기-> 로그 아래에 로그가 표시됩니다. 스크립트에 onedit 트리거가있는 경우 스프레드 시트를 변경하여 두 번째 탭에서 스크립트 편집기를 연 상태에서 기능을 트리거해야합니다. 그런 다음 스크립트 편집기 탭으로 이동하여 로그를여십시오. 당신은 당신의 함수가 로거에 전달하는 것을 볼 수 있습니다.

기본적으로 스크립트 편집기가 열려 있으면 이벤트가 로그에 기록되어 표시됩니다. 다른 사람이 파일의 다른 곳에 있으면 표시되지 않습니다.


5

나는이 게시물을 살펴 보았고 어떻게 든 간단한 답변을 찾았습니다. 단순하고 달콤한 솔루션을 원하는 사람들을 위해 여기에 게시하고 있습니다.

  1. console.log("Hello World")스크립트에서 사용하십시오 .
  2. https://script.google.com/home/my로 이동 하여 애드온을 선택하십시오.
  3. 프로젝트 세부 사항에서 줄임표 메뉴를 클릭하고 실행을 선택하십시오.

여기에 이미지 설명을 입력하십시오

  1. 최신 실행 헤더를 클릭하고 로그를 읽습니다.

여기에 이미지 설명을 입력하십시오


2019 년 4 월 이후에 생성 된 Google Apps 스크립트의 기본 "스택 드라이버 로깅"입니다 (Apps 스크립트 뒤의 "자동"프로젝트를 위해 Google 클라우드 프로젝트에 액세스 할 수없는 경우). Apps Script 프로젝트의 GCP를 변경하면 정기적 인 Stackdriver logging 답변이 적용됩니다.
tehhowch

1
여기서는 직접 실행 (스크립트 편집기에서 "실행"을 클릭 한 것) 만 볼 수 있지만 시트의 데이터 변경으로 인한 실행은 보이지 않습니다. 그것들을 어떻게 디버깅합니까?
Cris70

나는 그것을 미안하게 시도하지 않았습니다. 시트의 변경으로 함수가 트리거되고 함수에 로그가 있으면 로그가 함께 표시된다고 생각합니다. 변경은 항상 사용자에 의해 유발됩니까?
벤자민

1
예, 저도 상상했을 것입니다. 불행히도 그 일은 일어나지 않습니다. -(
Cris70

4

나는 같은 문제를 겪고있다. 웹에서 어딘가에 아래를 발견했다 ....

문서의 이벤트 핸들러는 약간 까다 롭습니다. 문서는 여러 사용자의 여러 동시 편집을 처리 할 수 ​​있으므로 이벤트 핸들러는 서버 측에서 처리됩니다. 이 구조의 주요 문제점은 이벤트 트리거 스크립트가 실패하면 서버에서 실패한다는 것입니다. 디버그 정보를 보려면 이벤트가 실패하거나 자동으로 실패 할 때 디버그 정보를 이메일로 보내는 트리거 메뉴 아래에 명시 적 트리거를 설정해야합니다.


흠, 그래, 나는 이것에 부딪쳤다-그것은 다음날 아침 내 스크립트에서 나에게 많은 오류를 이메일로 보냈다. 나는 그것을 알아내는 것을 끝내었다 (지금 나의 대답을 게시하는 것)
d0c_s4vage

1

우아하지는 않지만 디버깅하는 동안 종종 Logger에 로그인 한 다음 getLog () 를 사용 하여 내용을 가져옵니다. 그리고 나도 :

  • 결과를 변수에 저장합니다 (Google Scripts 디버거에서 검사 가능)-일부 코드에서는 중단 점을 설정할 수 없지만 나중에 실행되는 코드에서는 설정할 수 있습니다.
  • 임시 DOM 요소에 씁니다.
  • 경고로 표시

기본적으로 JavaScript 출력 문제가됩니다.

현대 console.log()구현 의 기능이 크게 부족 하지만 Logger는 여전히 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! 구글이 함수에 제공하는 더 많은 변수는 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로 작업 할 때 GAS 환경을 포함하는 모니터와 SS를 포함하는 모니터로 두 개의 모니터 (두 개의 창을 사용할 수 있음)가 설정되어있어 정보를 기록하고 기록 할 수 있습니다.


0

개발자 콘솔은 앱 스크립트에서 발생한 오류를 기록하므로 오류를 발생시켜 일반 console.log로 기록되도록 할 수 있습니다. 실행을 중지하지만 단계별 디버깅에는 여전히 유용 할 수 있습니다.

throw Error('hello world!');

콘솔과 비슷하게 콘솔에 나타납니다 console.log('hello world')


0

다음과 같이 스프레드 시트 코드를 디버깅하십시오.

...
throw whatAmI;
...

다음과 같이 표시됩니다.

여기에 이미지 설명을 입력하십시오


이미지에 사용자 정의 함수가 오류를 표시하는 방법을 보여 주지만 OP는 간단한 트리거 ( onEdit)를 사용하고 있다고 언급합니다.
Rubén
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.