ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Apps Script 행 높이 지정 메소드 오류 해결 방법
    AppsScript 2023. 12. 13. 23:18

    setRowHeight 메소드를 사용하여 특정 행의 높이를 설정하려고 하는 것을 확인할 수 있습니다. 그러나 코드의 현재 구조에서는 setRowHeight 메소드가 예상대로 작동하지 않을 수 있는 몇 가지 이유가 있습니다.

     

    • 비동기 처리 문제: Google Apps Script의 특정 API 호출(특히 Google Drive 및 Document 관련 API)은 비동기적으로 처리될 수 있습니다. 이로 인해 스크립트의 후속 부분이 API 호출의 완료 전에 실행되어, setRowHeight가 적절한 시점에 호출되지 않을 수 있습니다.
    • 스프레드시트 업데이트 지연: Google Sheets API는 때때로 변경 사항을 즉시 반영하지 않을 수 있습니다. 즉, 셀에 데이터를 쓴 직후에 행 높이를 설정하려고 하면, 스프레드시트가 아직 새로운 데이터를 완전히 반영하지 않았을 수 있습니다.
    • 오류 또는 제한 사항: setRowHeight 메소드가 예상대로 작동하지 않는다면, 스크립트에 오류가 있거나 Google Sheets API의 내부 제한 사항에 부딪힌 것일 수 있습니다.

    해결 방법

    • 스크립트 로그 추가: 스크립트에서 setRowHeight가 호출되는 시점과 해당 행 번호를 로그로 남겨 디버깅해보세요. Logger.log(lastRow)를 사용하여 해당 행 번호를 확인할 수 있습니다.
    • 스프레드시트 새로고침: 데이터를 기록한 후에 스프레드시트를 새로고침하는 코드를 추가해보세요. 예를 들어, SpreadsheetApp.flush()를 사용하여 스프레드시트의 변경 사항을 즉시 적용할 수 있습니다.
    • 스크립트 실행 지연: 데이터를 쓰고 setRowHeight를 호출하기 전에 스크립트 실행을 잠시 지연시키는 것을 고려해볼 수 있습니다. 예를 들어, Utilities.sleep(1000)을 사용하여 1초간 대기할 수 있습니다.

    디버깅

    Logger.log(lastRow)를 사용하여 행 번호를 로깅하려면, 스크립트에서 setRowHeight를 호출하기 바로 전에 이 코드를 추가해야 합니다. 이렇게 하면, setRowHeight가 호출되기 직전에 처리되는 행 번호가 무엇인지 확인할 수 있습니다.

     

    코드에서 lastRow 변수는 마지막 행 번호를 결정한 후에 설정되므로, setRowHeight 메소드를 호출하기 바로 전에 Logger.log를 추가합니다.

    // 마지막 행 찾기
    var lastRow = sheet.getLastRow() + 1;
    
    // 로깅하여 마지막 행 번호 확인
    Logger.log(lastRow);
    
    // B열부터 데이터 기록 및 하이퍼링크 적용
    sheet.getRange(lastRow, 2).setValue(docTitle); // B열
    sheet.getRange(lastRow, 3).setValue(docBody); // C열
    sheet.getRange(lastRow, 4).setValue(url); // D열
    
    // 행 높이 설정
    var rowHeight = 21; // 행 높이를 21픽셀로 설정
    sheet.setRowHeight(lastRow, rowHeight);

    이렇게 수정한 후 스크립트를 실행하면, Google Apps Script 편집기의 "로그 보기" 옵션을 통해 lastRow의 값을 확인할 수 있습니다. 이 정보는 스크립트가 올바른 행에 작업을 수행하고 있는지 확인하는 데 도움이 됩니다. 로그는 스크립트 실행 후 "실행" 메뉴에서 "로그 보기"를 선택하여 확인할 수 있습니다.

     

    스프레드시트 새로고침

    SpreadsheetApp.flush()는 스프레드시트의 모든 보류 중인 변경사항을 즉시 적용하는 데 사용됩니다. 이 메소드는 데이터를 쓰고, 행 높이를 설정한 후에 호출하는 것이 좋습니다. 이렇게 하면, 스프레드시트의 변경사항이 먼저 처리되고, 그 후에 행 높이 설정이 적용됩니다.

     

    따라서, SpreadsheetApp.flush()를 setRowHeight 메소드 호출 바로 다음에 넣는 것이 적절합니다. 다음은 코드 예시입니다:

     

    // 마지막 행 찾기
    var lastRow = sheet.getLastRow() + 1;
    
    // B열부터 데이터 기록 및 하이퍼링크 적용
    sheet.getRange(lastRow, 2).setValue(docTitle); // B열
    sheet.getRange(lastRow, 3).setValue(docBody); // C열
    sheet.getRange(lastRow, 4).setValue(url); // D열
    
    // 행 높이 설정
    var rowHeight = 21; // 행 높이를 21픽셀로 설정
    sheet.setRowHeight(lastRow, rowHeight);
    
    // 스프레드시트의 변경사항 적용
    SpreadsheetApp.flush();

    이렇게 수정한 후 스크립트를 실행하면, setRowHeight 메소드가 올바르게 작동하는지 확인할 수 있습니다. 만약 여전히 문제가 발생한다면, setRowHeight 메소드의 사용 방식이나 스크립트의 다른 부분에서 문제가 발생했는지 추가로 확인이 필요합니다.

     

    실행 지연

    스크립트 실행 지연을 위해 Utilities.sleep(milliseconds) 함수를 사용하여 스크립트의 실행을 잠시 중단할 수 있습니다. 이 방법은 스크립트의 다른 부분이 완전히 처리된 후에 행 높이 설정을 시도하기 위해 사용됩니다. Utilities.sleep(milliseconds) 함수는 지정된 밀리초 동안 스크립트의 실행을 일시적으로 중지시킵니다.

     

    행 높이 설정 전에 일정 시간을 지연시키기 위해, setRowHeight 메소드 호출 전에 Utilities.sleep(milliseconds)를 추가합니다. 예를 들어, 1초(1000 밀리초) 동안 대기하도록 설정할 수 있습니다.

     

    // 마지막 행 찾기
    var lastRow = sheet.getLastRow() + 1;
    
    // B열부터 데이터 기록 및 하이퍼링크 적용
    sheet.getRange(lastRow, 2).setValue(docTitle); // B열
    sheet.getRange(lastRow, 3).setValue(docBody); // C열
    sheet.getRange(lastRow, 4).setValue(url); // D열
    
    // 1초(1000 밀리초) 동안 실행 지연
    Utilities.sleep(1000);
    
    // 행 높이 설정
    var rowHeight = 21; // 행 높이를 21픽셀로 설정
    sheet.setRowHeight(lastRow, rowHeight);

    이렇게 수정한 후 스크립트를 실행하면, 데이터를 기록한 후 1초 동안 대기한 다음에 행 높이를 설정합니다. 이 방법이 효과적이지 않다면, 스크립트의 다른 부분에서 문제가 있거나, setRowHeight 메소드 자체에 제한이 있을 수 있습니다. 이 경우, 문제 해결을 위해 다른 접근 방식을 고려해야 할 수도 있습니다. 예를 들어, 행 높이를 설정하는 대신 셀의 내용에 맞게 행 높이가 자동으로 조절되도록 하는 방법 등이 있습니다.

     

    An illustration depicting the solution to an error involving the row height setting method in Google Apps Script.
    An illustration depicting the solution to an error involving the row height setting method in Google Apps Script.

Designed by Tistory.