문제 해결

가장 경험이 많은 개발자라도 처음에 코드를 올바르게 작성하는 경우는 거의 없으므로 문제 해결은 개발 프로세스의 중요한 부분입니다. 이 섹션에서는 스크립트의 오류를 찾고 이해하고 디버그하는 데 도움이 되는 몇 가지 기법을 설명합니다.

오류 메시지

스크립트에 오류가 발생하면 오류 메시지가 표시됩니다. 메시지와 함께 문제 해결에 사용되는 줄 번호가 표시됩니다. 이 방식으로 표시되는 오류에는 문법 오류런타임 오류라는 두 가지 기본 유형이 있습니다.

구문 오류

구문 오류는 JavaScript 문법을 따르지 않는 코드를 작성하면 발생하며 스크립트를 저장하려고 하면 즉시 오류가 감지됩니다. 예를 들어 다음 코드 스니펫에는 구문 오류가 있습니다.

function emailDataRow(rowNumber) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var rowData = data[rowNumber-1].join(" ";
  MailApp.sendEmail('john@example.com',
                    'Data in row ' + rowNumber,
                    rowData);
}

여기서 구문 문제는 네 번째 줄 끝에 ) 문자가 누락된 것입니다. 스크립트를 저장하려고 하면 다음과 같은 오류가 발생합니다.

인수 목록 뒤에 )가 누락되었습니다. (4번 행)

이러한 유형의 오류는 즉시 발견되고 일반적으로 원인이 간단하므로 일반적으로 쉽게 해결할 수 있습니다. 구문 오류가 포함된 파일은 저장할 수 없습니다. 즉, 유효한 코드만 프로젝트에 저장됩니다.

런타임 오류

이러한 오류는 함수나 클래스를 잘못 사용하면 발생하며 스크립트를 실행한 후에만 감지할 수 있습니다. 예를 들어 다음 코드는 런타임 오류를 일으킵니다.

function emailDataRow(rowNumber) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var rowData = data[rowNumber-1].join(" ");
  MailApp.sendEmail('john',
                    'Data in row ' + rowNumber,
                    rowData);
}

코드의 형식은 올바르지만 MailApp.sendEmail를 호출할 때 이메일 주소에 'john' 값을 전달합니다. 이는 유효한 이메일 주소가 아니므로 스크립트를 실행할 때 다음 오류가 발생합니다.

잘못된 이메일: john (5번 행)

이러한 오류를 해결하기가 더 어려운 이유는 함수에 전달하는 데이터가 코드에 작성되지 않고 스프레드시트, 양식 또는 기타 외부 데이터 소스에서 가져오는 경우가 많기 때문입니다. 아래의 디버깅 기법을 사용하면 이러한 오류의 원인을 파악하는 데 도움이 됩니다.

일반적인 실수

다음은 일반적인 오류와 그 원인입니다.

서비스가 너무 많이 호출됨: <action name>

이 오류는 특정 작업의 일일 할당량을 초과했음을 나타냅니다. 예를 들어 하루에 너무 많은 이메일을 보내면 이 오류가 발생할 수 있습니다. 할당량은 일반, 도메인, 프리미어 계정에 따라 서로 다른 수준으로 설정되며 Google에서 사전 공지 없이 언제든지 변경될 수 있습니다. Apps Script 할당량 문서에서 다양한 작업의 할당량 한도를 확인할 수 있습니다.

서버를 사용할 수 없습니다. 또는 서버 오류가 발생했습니다. 다시 시도해 주세요.

이러한 오류의 원인은 다음과 같습니다.

  • Google 서버 또는 시스템을 일시적으로 사용할 수 없습니다. 잠시 기다린 후 스크립트를 다시 실행해 봅니다.
  • 스크립트에 상응하는 오류 메시지가 없는 오류가 있습니다. 스크립트를 디버그하여 문제를 파악할 수 있는지 확인합니다.
  • Google Apps Script에 이 오류를 일으키는 버그가 있습니다. 버그 신고를 검색하고 제출하는 방법에 관한 안내는 버그를 참고하세요. 새 버그를 신고하기 전에 다른 사용자가 이미 신고했는지 검색합니다.

작업을 수행하려면 인증이 필요합니다.

이 오류는 스크립트에 실행에 필요한 승인이 없음을 나타냅니다. 스크립트가 스크립트 편집기에서 실행되거나 맞춤 메뉴 항목에서 실행되면 사용자에게 승인 대화상자가 표시됩니다. 하지만 스크립트가 트리거에서 실행되거나 Google Sites 페이지에 삽입되거나 서비스로 실행되면 대화상자가 표시되지 않고 이 오류가 표시됩니다.

스크립트를 승인하려면 스크립트 편집기를 열고 함수를 실행합니다. 스크립트 프로젝트를 승인할 수 있는 승인 메시지가 표시됩니다. 스크립트에 승인되지 않은 새 서비스가 포함된 경우 스크립트를 다시 승인해야 합니다.

이 오류는 사용자가 승인하기 전에 실행되는 트리거로 인해 자주 발생합니다. 사용하는 부가기능에서 오류가 발생하여 스크립트 프로젝트에 액세스할 수 없는 경우 일반적으로 부가기능을 다시 사용하여 스크립트를 승인할 수 있습니다. 트리거가 계속 실행되어 이 오류가 발생하는 경우 다음을 실행하여 트리거를 삭제할 수 있습니다.

  1. Apps Script 프로젝트 왼쪽에서 트리거 를 클릭합니다.
  2. 삭제하려는 트리거의 오른쪽에서 더보기 > 트리거 삭제를 클릭합니다.

부가기능을 제거하여 문제가 있는 부가기능 트리거를 삭제할 수도 있습니다.

액세스가 거부됨: DriveApp 또는 도메인 정책으로 인해 서드 파티 Drive 앱이 사용 중지됨

도메인의 관리자는 도메인에 대해 Drive API를 사용 중지할 수 있습니다. 이렇게 하면 사용자가 Google Drive 앱을 설치하고 사용하지 못하게 됩니다. 또한 이 설정은 관리자가 Drive API를 사용 중지하기 전에 스크립트가 승인된 경우에도 사용자가 Drive 서비스 또는 고급 Drive 서비스를 사용하는 Apps Script 부가기능을 사용할 수 없도록 합니다.

하지만 Drive 서비스를 사용하는 부가기능 또는 웹 앱이 도메인 전체 설치용으로 게시되고 관리자가 도메인의 일부 또는 모든 사용자를 위해 설치한 경우, 도메인에서 Drive API가 사용 중지되어 있더라도 해당 사용자의 스크립트가 작동합니다.

스크립트에 활성 사용자의 ID를 가져올 권한이 없습니다.

활성 사용자의 ID와 이메일을 스크립트에서 사용할 수 없음을 나타냅니다. 이 경고는 Session.getActiveUser() 호출로 인해 발생합니다. 스크립트가 AuthMode.FULL가 아닌 승인 모드에서 실행 중인 경우 Session.getEffectiveUser() 호출로 인해 발생할 수도 있습니다. 이 경고가 신호되면 후속 User.getEmail() 호출은 ''만 반환합니다.

스크립트가 실행되는 승인 모드에 따라 이 경고를 해결하는 방법에는 여러 가지가 있습니다. 승인 모드는 트리거된 함수에서 e 이벤트 매개변수authMode 속성으로 노출됩니다.

  • AuthMode.FULL에서는 대신 Session.getEffectiveUser()를 사용하는 것이 좋습니다.
  • AuthMode.LIMITED에서 소유자가 스크립트를 승인했는지 확인합니다.
  • 다른 승인 모드에서는 두 메서드 중 하나를 호출하지 마세요.
  • 설치 가능한 트리거에서 이 경고가 새로 표시되는 고객인 경우 트리거가 조직 내 사용자로 실행되고 있는지 확인합니다.

라이브러리가 누락됨

스크립트에 인기 있는 라이브러리를 추가하면 라이브러리가 스크립트의 종속 항목으로 표시되어 있더라도 라이브러리가 누락되었다는 오류 메시지가 표시될 수 있습니다. 너무 많은 사용자가 동시에 라이브러리에 액세스하고 있기 때문일 수 있습니다. 이 오류를 방지하려면 다음 해결 방법 중 하나를 시도해 보세요.

  • 라이브러리의 코드를 스크립트에 복사하여 붙여넣고 라이브러리 종속 항목을 삭제합니다.
  • 라이브러리 스크립트를 복사하여 계정에서 라이브러리로 배포합니다. 원래 스크립트의 종속 항목을 공개 라이브러리 대신 새 라이브러리로 업데이트해야 합니다.

라이브러리 버전 또는 배포 버전 누락으로 인해 오류가 발생했습니다. 오류 코드 Not_Found

이 오류 메시지는 다음 중 하나를 나타냅니다.

  • 배포된 스크립트 버전이 삭제되었습니다. 스크립트의 배포된 버전을 업데이트하려면 버전이 지정된 배포 수정을 참고하세요.
  • 스크립트에서 사용하는 라이브러리 버전이 삭제되었습니다. 누락된 라이브러리를 확인하려면 라이브러리 이름 옆에 있는 더보기 > 새 탭에서 열기를 클릭합니다. 누락된 라이브러리로 인해 오류 메시지가 표시됩니다. 업데이트해야 하는 라이브러리를 찾은 후 다음 작업 중 하나를 실행합니다.
    • 다른 버전을 사용하도록 라이브러리를 업데이트합니다. 라이브러리 업데이트를 참고하세요.
    • 스크립트 프로젝트 및 코드에서 삭제된 라이브러리를 삭제합니다. 라이브러리 삭제를 참고하세요.
  • 스크립트에서 사용하는 라이브러리의 스크립트에 삭제된 버전을 사용하는 다른 라이브러리가 포함되어 있습니다. 다음 작업 중 하나를 수행합니다.
    • 스크립트에서 사용하는 라이브러리에 대한 수정 액세스 권한이 있는 경우 해당 스크립트의 보조 라이브러리를 기존 버전으로 업데이트합니다.
    • 다른 버전을 사용하도록 라이브러리를 업데이트합니다. 라이브러리 업데이트를 참고하세요.
    • 스크립트 프로젝트 및 코드에서 라이브러리를 삭제합니다. 라이브러리 삭제를 참고하세요.

오류 400: 고급 서비스로 Google Chat API를 호출할 때 invalid_scope 발생

Some requested scopes cannot be shown 오류 메시지와 함께 Error 400: invalid_scope가 발생하면 Apps Script 프로젝트의 appsscript.json 파일에 승인 범위를 지정하지 않은 것입니다. 대부분의 경우 Apps Script는 스크립트에 필요한 범위를 자동으로 결정하지만 Chat 고급 서비스를 사용하는 경우 스크립트에서 사용하는 승인 범위를 Apps Script 프로젝트의 매니페스트 파일에 수동으로 추가해야 합니다. 명시적 범위 설정을 참고하세요.

이 오류를 해결하려면 oauthScopes 배열의 일부로 적절한 승인 범위를 Apps Script 프로젝트의 appsscript.json 파일에 추가합니다. 예를 들어 spaces.messages.create 메서드를 호출하려면 다음을 추가합니다.

"oauthScopes": [
  "https://www.googleapis.com/auth/chat.messages.create"
]

관리자가 <URL>에 대한 UrlFetch 호출을 허용하지 않습니다

Google Workspace 관리자는 관리 콘솔에서 허용 목록을 사용 설정하여 Apps Script를 통해 액세스할 수 있는 외부 도메인을 관리할 수 있습니다.

이 오류를 해결하려면 관리자에게 문의하여 URL을 허용 목록에 추가하도록 요청하세요.

디버깅

모든 실수가 오류 메시지를 표시하는 것은 아닙니다. 코드가 기술적으로 올바르고 실행할 수 있지만 결과가 예상과 다른 더 미묘한 오류가 있을 수 있습니다. 다음은 이러한 상황을 처리하고 예상대로 실행되지 않는 스크립트를 자세히 조사하는 몇 가지 전략입니다.

로깅

디버깅하는 동안 스크립트 프로젝트가 실행될 때 정보를 기록하는 것이 유용한 경우가 많습니다. Google Apps Script에는 정보를 로깅하는 두 가지 메서드가 있습니다. Cloud 로깅 서비스와 Apps Script 편집기에 내장된 더 기본적인 로거 및 콘솔 서비스입니다.

자세한 내용은 Logging 가이드를 참고하세요.

Error Reporting

런타임 오류로 인해 발생하는 예외는 Google Cloud Error Reporting 서비스를 사용하여 자동으로 기록됩니다. 이 서비스를 사용하면 스크립트 프로젝트에서 생성하는 예외 메시지를 검색하고 필터링할 수 있습니다.

Error Reporting에 액세스하려면 Google Cloud Platform Console에서 Cloud 로그 및 오류 보고서 보기를 참고하세요.

실행

스크립트를 실행할 때마다 Apps Script는 Cloud 로그를 포함하여 실행 기록을 만듭니다. 이러한 레코드를 통해 스크립트가 실행한 작업을 파악할 수 있습니다.

Apps Script 프로젝트에서 스크립트 실행을 보려면 왼쪽에서 실행 을 클릭합니다.

Apps Script 서비스 상태 확인

드물지만 특정 Google Workspace 서비스 (예: Gmail 또는 Drive)에 서비스 중단으로 이어질 수 있는 일시적인 문제가 발생하는 경우가 있습니다. 이 경우 이러한 서비스와 상호작용하는 Apps Script 프로젝트가 예상대로 작동하지 않을 수 있습니다.

Google Workspace 상태 대시보드에서 Google Workspace 서비스 중단이 있는지 확인할 수 있습니다. 현재 서비스 중단이 발생한 경우 문제가 해결될 때까지 기다리거나 Google Workspace 고객센터 또는 Google Workspace 알려진 문제 문서에서 추가 지원을 받으세요.

디버거 및 중단점 사용

스크립트에서 문제를 찾으려면 디버그 모드로 실행하면 됩니다. 디버그 모드에서 실행하면 스크립트가 중단점에 도달할 때 일시중지됩니다. 중단점은 스크립트에서 문제가 있을 수 있다고 생각되는 줄을 강조 표시한 줄입니다. 스크립트가 일시중지되면 해당 시점의 각 변수 값이 표시되므로 로깅 문을 많이 추가하지 않고도 스크립트의 내부 작동을 검사할 수 있습니다.

중단점 추가

중단점을 추가하려면 중단점을 추가할 줄의 줄 번호 위로 마우스를 가져갑니다. 행 번호 왼쪽에 있는 원을 클릭합니다. 아래 이미지는 스크립트에 추가된 중단점의 예를 보여줍니다.

중단점 추가

디버그 모드에서 스크립트 실행

디버그 모드에서 스크립트를 실행하려면 편집기 상단에서 디버그를 클릭합니다.

스크립트가 중단점이 있는 선을 실행하기 전에 일시중지하고 디버그 정보 표를 표시합니다. 이 표를 사용하여 매개변수 값, 객체에 저장된 정보와 같은 데이터를 검사할 수 있습니다.

스크립트 실행 방식을 제어하려면 디버거 패널 상단에서 'Step in'(중단점으로 이동), 'Step over'(중단점 건너뛰기), 'Step out'(중단점으로 나감) 버튼을 사용합니다. 이를 통해 한 번에 한 줄씩 스크립트를 실행하고 시간이 지남에 따라 값이 어떻게 변경되는지 검사할 수 있습니다.

여러 Google 계정 관련 문제

여러 Google 계정에 동시에 로그인된 경우 부가기능 및 웹 앱에 액세스하는 데 문제가 있을 수 있습니다. Apps Script, 부가기능, 웹 앱에서는 멀티 로그인, 즉 동시에 여러 Google 계정에 로그인하는 기능이 지원되지 않습니다.

  • 두 개 이상의 계정에 로그인한 상태에서 Apps Script 편집기를 열면 계속할 계정을 선택하라는 메시지가 표시됩니다.

  • 웹 앱 또는 부가기능을 열 때 멀티 로그인 문제가 발생하면 다음 해결 방법 중 하나를 시도해 보세요.

    • 모든 Google 계정에서 로그아웃하고 액세스하려는 부가기능 또는 웹 앱이 있는 계정으로만 로그인합니다.
    • Chrome의 시크릿 창 또는 이에 상응하는 시크릿 브라우징 창을 열고 액세스하려는 부가기능 또는 웹 앱이 있는 Google 계정에 로그인합니다.

도움 받기

위에 나열된 도구와 기법을 사용하여 문제를 디버그하면 다양한 문제를 해결할 수 있지만, 추가 지원이 필요한 문제가 발생할 수도 있습니다. 질문하고 버그를 신고할 수 있는 위치에 대한 자세한 내용은 지원 페이지를 참고하세요.