문제 해결

가장 숙련된 개발자도 첫 번째 시도에서 코드를 올바르게 작성하는 경우가 드물기 때문에 문제 해결이 개발 프로세스에서 중요한 부분입니다. 이 섹션에서는 스크립트의 오류를 찾고 파악하고 디버그하는 데 도움이 되는 기법을 설명합니다.

오류 메시지

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

구문 오류

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

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

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

일반적인 실수

다음은 자주 발생하는 오류와 그 원인 목록입니다.

서비스가 너무 많이 호출됨: <작업 이름>

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

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

이러한 오류가 발생하는 몇 가지 원인은 다음과 같습니다.

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

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

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

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

이 오류는 사용자가 승인하기 전에 실행되는 트리거로 인해 발생하는 경우가 많습니다. 스크립트 프로젝트에 액세스할 수 없는 경우(예를 들어 사용 중인 부가기능에서 오류가 발생하기 때문에) 보통은 부가기능을 다시 사용하여 스크립트를 승인할 수 있습니다. 트리거가 계속 실행되어 이 오류가 발생하면 다음을 수행하여 트리거를 삭제할 수 있습니다.

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

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

액세스 거부됨: DriveApp 또는 도메인 정책에서 서드 파티 드라이브 앱을 사용 중지했습니다.

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

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

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

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

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

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

라이브러리가 없음

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

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

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

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

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

고급 서비스로 Google Chat API를 호출하는 경우 Error 400: invalid_scope

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

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

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

디버깅

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

로깅

디버깅할 때는 스크립트 프로젝트가 실행될 때 정보를 기록하는 것이 유용한 경우가 많습니다. Google Apps Script에는 정보 로깅에 사용되는 두 가지 방법이 있습니다. 하나는 클라우드 로깅 서비스이고 다른 하나는 Apps Script 편집기에 기본 제공되는 보다 기본적인 로거 및 콘솔 서비스입니다.

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

Error Reporting

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

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

실행

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

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

Apps Script 서비스 상태 확인 중

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

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

디버거 및 중단점 사용

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

중단점 추가

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

중단점 추가

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

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

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

스크립트 실행 방법을 제어하려면 Debugger 패널 상단에서 'Step in', 'Step Over', 'Step Out' 버튼을 사용합니다. 이렇게 하면 스크립트를 한 번에 한 줄씩 실행하고 시간이 지남에 따라 값이 어떻게 변경되는지 검사할 수 있습니다.

여러 Google 계정 관련 문제

동시에 여러 Google 계정에 로그인한 경우 부가기능과 웹 앱에 액세스하는 데 문제가 발생할 수 있습니다. Apps Script, 부가기능 또는 웹 앱에서는 멀티 로그인이나 한 번에 여러 Google 계정에 로그인할 수 없습니다.

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

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

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

지원 받기

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