Google 스프레드 시트에서 일부 스크립팅 기능을 추가 할 수 있습니다. onEdit
이벤트를 위해 무언가를 추가하고 있지만 이벤트가 작동하는지 알 수 없습니다. 내가 알 수있는 한 Google 스프레드 시트에서 라이브 이벤트를 디버깅 할 수 없으므로 디버거에서 수행해야합니다. 디버거에서 수행해야합니다. 내 onEdit()
함수에 전달 된 이벤트 인수가 이벤트 에서 실행되면 항상 정의되지 않기 때문에 의미가 없습니다. Script Editor
.
그래서 함수를 호출 Logger.log
할 때마다 메소드 를 사용하여 일부 데이터를 기록 하려고 시도 onEdit
했지만 이것도에서 실행될 때만 작동하는 것처럼 보입니다 Script Editor
. 에서 실행하면 Script Editor
로 이동하여 로그를 볼 수 있습니다View->Logs...
이벤트가 실제로 실행될 때의 로그를 볼 수 있기를 바랐지만 이해할 수 없었습니다.
이 물건을 어떻게 디버깅합니까?
답변
최신 정보:
이 답변에 쓰여진 것처럼
-
Stackdriver Logging 은 현재 선호되는 로깅 방법입니다.
-
console.log()
Stackdriver에 로그인하는 데 사용 합니다.
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();
};
답변
내가 알 수있는 한, Google 문서에서 라이브 이벤트를 디버깅 할 수 없으므로 디버거에서 수행해야합니다. 내 onEdit () 함수에 전달 된 이벤트 인수가 실행되면 항상 정의되지 않기 때문에 의미가 없습니다. 스크립트 편집기에서
참-디버깅을 위해 이벤트 인수를 직접 정의하십시오. GAS에서 트리거 기능을 테스트하는 방법을 참조하십시오 .
onEdit 함수가 호출 될 때마다 Logger.log 메서드를 사용하여 일부 데이터를 기록하려고했지만 스크립트 편집기에서 실행할 때만 작동하는 것처럼 보입니다. 스크립트 편집기에서 실행할 때 View-> Logs …로 이동하여 로그를 볼 수 있습니다.
다시 사실이지만 도움이 있습니다. Peter Hermann의 BetterLog 라이브러리 는 모든 로그를 스프레드 시트로 리디렉션하여 편집기 / 디버거의 인스턴스에 첨부되지 않은 코드에서도 로깅을 가능하게합니다.
예를 들어 스프레드 시트가 포함 된 스크립트로 코딩하는 경우이 한 줄만 스크립트 파일의 맨 위에 추가하면 모든 로그가 스프레드 시트의 “로그”시트로 이동합니다. 다른 코드는 필요하지 않습니다 Logger.log()
. 평소와 같이 사용하십시오 .
Logger = BetterLog.useSpreadsheet();
답변
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
를 확인하여 출력을 확인하십시오.
답변
조금 해 키지 만 “console”이라는 배열을 만들었고 언제든지 콘솔에 출력하고 싶을 때 배열로 푸시했습니다. 그런 다음 실제 출력을보고 싶을 때마다 console
이전에 반환 한 것이 아닌 방금 반환 했습니다.
//return 'console' //uncomment to output console
return "actual output";
}
답변
스크립트 편집기가 열려 있으면보기-> 로그 아래에 로그가 표시됩니다. 스크립트에 onedit 트리거가있는 경우 스프레드 시트를 변경하여 두 번째 탭에서 스크립트 편집기를 연 상태에서 기능을 트리거해야합니다. 그런 다음 스크립트 편집기 탭으로 이동하여 로그를여십시오. 당신은 당신의 함수가 로거에 전달하는 것을 볼 수 있습니다.
기본적으로 스크립트 편집기가 열려 있으면 이벤트가 로그에 기록되어 표시됩니다. 다른 사람이 파일의 다른 곳에 있으면 표시되지 않습니다.
답변
나는이 게시물을 살펴 보았고 어떻게 든 간단한 답변을 찾았습니다. 단순하고 달콤한 솔루션을 원하는 사람들을 위해 여기에 게시하고 있습니다.
console.log("Hello World")
스크립트에서 사용하십시오 .- https://script.google.com/home/my로 이동 하여 애드온을 선택하십시오.
- 프로젝트 세부 사항에서 줄임표 메뉴를 클릭하고 실행을 선택하십시오.
- 최신 실행 헤더를 클릭하고 로그를 읽습니다.
답변
나는 같은 문제를 겪고있다. 웹에서 어딘가에 아래를 발견했다 ….
문서의 이벤트 핸들러는 약간 까다 롭습니다. 문서는 여러 사용자의 여러 동시 편집을 처리 할 수 있으므로 이벤트 핸들러는 서버 측에서 처리됩니다. 이 구조의 주요 문제점은 이벤트 트리거 스크립트가 실패하면 서버에서 실패한다는 것입니다. 디버그 정보를 보려면 이벤트가 실패하거나 자동으로 실패 할 때 디버그 정보를 이메일로 보내는 트리거 메뉴 아래에 명시 적 트리거를 설정해야합니다.
