자동화를 처음 만들면 코드보다 먼저 권한 창을 만납니다. 「모든 스프레드시트를 보고, 수정하고, 만들고, 삭제」할 수 있게 해 달라는 창입니다. 시트 하나에 알림 하나를 붙이려는 건데, 문장은 「모든」입니다. 여기서 멈추는 분이 많습니다.
구글 시트·폼에 붙인 Apps Script로 네 번, n8n으로 한 번 자동화를 만드는 동안 권한 창을 여러 번 봤습니다. 같은 코드인데 두 번 뜨기도 했고, 한 줄 바꿨더니 항목이 하나 붙기도 했습니다. 겪고 나니 권한 창은 무서운 것이 아니라 읽을 것이 있는 화면이었습니다. 이 글은 그 권한 창들의 문구를 원문대로 옮기고, 볼 때마다 무엇을 확인하면 되는지를 정리한 것입니다.
권한 창이 뜬 때와 그 문구
| 언제 | 화면에 나온 항목 (원문) |
|---|---|
| 시트 알림 코드를 편집기에서 처음 「실행」 | 내 이메일 주소로 이메일 보내기 |
| 같은 코드에 「수정 시」 트리거를 걸고 저장 | 모든 Google Sheets 스프레드시트 보기·수정·생성·삭제 + 내 이름으로 이메일 보내기 |
| 시트에서 n8n을 부르게 코드 한 줄을 바꾸고 트리거 저장 | See, edit, create, and delete all your Google Sheets spreadsheets / Connect to an external service |
| 폼 응답 시트에 「양식 제출 시」 트리거를 걸고 저장 | See, edit, create, and delete all your Google Sheets spreadsheets / View and manage your forms in Google Drive / Send email as you |
| 매일 아침 도는 코드를 편집기에서 처음 「실행」 | 모든 Google Sheets 스프레드시트 확인, 수정, 생성, 삭제 / 내 이메일 주소로 이메일 보내기 (항목마다 체크박스) |
(영어로 나온 창은 화면에 나온 그대로 옮겼습니다. 창에 따라 한국어로도, 영어로도 나왔습니다.)
1. 같은 코드인데 권한 창이 두 번 떴습니다
시트에 줄이 차면 메일을 보내는 코드를 처음 편집기에서 실행했을 때, 권한 창이 요구한 것은 「내 이메일 주소로 이메일 보내기」 하나였습니다. 승인했습니다.
그런데 같은 코드에 「수정 시」 트리거를 걸고 저장하자 권한 창이 한 번 더 떴고, 이번에는 「모든 Google Sheets 스프레드시트 보기·수정·생성·삭제」가 붙었습니다. 코드는 한 글자도 바꾸지 않았습니다. 바뀐 것은 트리거를 건 것뿐입니다.
「모든」이라는 말은 이 스크립트가 실제로 모든 시트를 연다는 뜻이 아니라, 구글이 권한을 나누는 단위가 「스프레드시트 전체」이기 때문으로 보입니다. 시트 하나에 붙은 스크립트에 트리거를 걸 때마다 이렇게 나왔습니다.
Apps Script 공식 문서는 이 범위를 누가 정하는지 이렇게 설명합니다.
그리고 바로 뒤에 이런 문장이 있습니다.
즉 코드를 훑어서 자동으로 정하고, 그 결과가 필요보다 넓을 때도 있다는 것입니다. 스크립트가 무엇을 요구하는지는 같은 문서가 알려 주는 대로, 편집기 왼쪽의 개요(Overview) 화면에 있는 「Project OAuth Scopes」에서 목록으로 볼 수 있습니다. 권한 창이 한 번 지나가 버렸어도 여기서 다시 확인할 수 있습니다.
2. 한 줄 바꿨더니 항목이 하나 붙었습니다
시트에서 메일을 보내던 코드의 한 줄을, 메일 대신 n8n 주소를 부르는 줄(UrlFetchApp)로 바꿨습니다. 트리거를 다시 저장하자 권한 창에 항목이 하나 새로 붙었습니다.
Connect to an external service
시트 안에서 끝날 때는 없던 항목입니다. 바깥 주소를 부르는 줄이 생겼으니 「외부 서비스에 연결」 권한이 필요해진 것입니다. 코드가 무엇을 새로 하게 됐는지가 권한 창에 그대로 나타났습니다.
폼 접수 알림을 만들 때는 반대였습니다. 코드에는 폼을 다루는 줄이 한 줄도 없었는데, 「양식 제출 시」 트리거를 거는 것만으로 이 항목이 붙었습니다.
View and manage your forms in Google Drive
코드만 보고는 설명이 안 되는 항목이었지만, 폼이 제출될 때 불리는 트리거를 걸었으니 폼에 대한 권한이 따라온 것으로 이해했습니다.
두 경우를 합치면, 권한 창에 새 항목이 보일 때 물어볼 것은 하나입니다. 「방금 무엇을 바꿨지?」 코드 한 줄이든 트리거 하나든, 바꾼 것과 새 항목이 짝이 맞으면 이상한 것이 아닙니다. 짝이 안 맞으면 그때 멈추고 보면 됩니다.
3. 항목마다 체크박스가 있었습니다
매일 아침 도는 코드를 만들 때 뜬 권한 창은 생김새가 달랐습니다. 항목마다 체크박스가 붙어 있었고, 체크하지 않고 「계속」을 누르면 넘어가지 않았습니다. 「모두 선택」을 체크하고 나서야 넘어갔습니다.
공식 문서는 이것을 이렇게 설명합니다.
권한을 항목별로 골라서 줄 수 있게 된 것입니다. 저희는 전부 체크했기 때문에, 일부만 줬을 때 스크립트가 어떻게 되는지는 확인하지 못했습니다. 다만 메일을 보내는 코드에서 「이메일 보내기」를 빼고 주면, 메일을 보내는 줄에서 멈출 것이라고 봅니다. 체크박스가 보이면 「이 코드가 하는 일에 이 항목이 필요한가」를 하나씩 대조하는 기회로 쓰시면 됩니다.

4. 도구 밖에서 연결할 때 — 범위가 더 넓기도, 더 좁기도 했습니다
Apps Script는 코드를 훑어 범위를 정하지만, 바깥 도구가 구글에 연결할 때는 그 도구가 범위를 정해서 요청합니다.
n8n에서 구글 시트를 직접 읽게 하려고 구글 자격증명을 만들 때, n8n이 만든 로그인 주소에 요청하는 범위가 그대로 들어 있었습니다. spreadsheets 말고도 drive, drive.file, drive.metadata가 있었습니다. 시트만이 아니라 드라이브 전체입니다. 앞의 Apps Script 권한 창보다 넓거나 비슷한 범위였습니다. 이 경로는 다른 이유(클라우드 콘솔 설정)로 중간에 접어서, 이 범위로 실제 승인까지 가지는 않았습니다.
반대로 좁아서 막힌 적도 있습니다. 시트에 값을 프로그램으로 넣어 보려고 외부 도구를 썼는데, 같은 계정인데도 브라우저에서 만든 시트를 못 찾았습니다.
Requested entity was not found.
시트 주소를 잘못 넣은 줄 알았는데, 그 도구가 「자기가 만든 시트만 볼 수 있는 권한」으로 연결돼 있었습니다. 그 도구로 시트를 새로 만든 뒤에야 값을 넣을 수 있었습니다. 구글 드라이브 문서에는 이런 좁은 범위가 따로 있습니다.
그 도구가 쓰던 범위가 정확히 이것이었는지는 기록에 없습니다. 다만 외부 도구가 시트를 「없다」고 할 때는, 주소 오타보다 연결된 범위부터 의심하는 편이 빨랐습니다.
5. 「확인되지 않은 앱」 경고는 나오지 않았습니다
직접 만든 스크립트를 승인할 때 「확인되지 않은 앱」이라는 경고가 한 단계 더 나온다는 이야기를 자주 봅니다. 저희가 쓴 계정은 회사 구글 워크스페이스 계정이었고, 시트 알림에서도 폼 알림에서도 이 경고는 나오지 않았습니다.
개인 Gmail 계정에서는 이 경고가 나온다는 글을 자주 보지만, 저희는 개인 계정으로 해 보지 않아서 확인하지 못했습니다. 개인 계정으로 만드신다면 권한 창이 이 글의 표와 다르게 나올 수 있습니다.
권한 창에서 확인할 것
- 이 코드가 하는 일을 한 줄로 적어 보고, 항목과 대조합니다. 메일을 보내는 코드라면 「이메일 보내기」가 있는 것이 맞습니다
- 새 항목이 붙으면 방금 무엇을 바꿨는지 봅니다. 바깥 주소를 부르는 줄 → 「외부 서비스에 연결」, 폼 트리거 → 「양식 보기·관리」
- 「모든 스프레드시트」는 권한을 나누는 단위로 보입니다. 스크립트가 실제로 여는 시트는 코드가 정합니다
- 권한 창이 지나갔어도 편집기의 개요 → 「Project OAuth Scopes」에서 다시 볼 수 있습니다
- 체크박스가 있으면 항목마다 필요한지 대조합니다
- 바깥 도구를 연결할 때는 그 도구가 요청하는 범위를 로그인 창에서 봅니다. 너무 넓어도, 너무 좁아도 문제였습니다
- 누구 계정으로 승인하는지 봅니다. 트리거는 승인한 사람 계정으로 돌기 때문에, 그 사람이 회사를 떠나면 멈춥니다
이 글이 다루지 않은 것
개인 Gmail 계정의 권한 창과 「확인되지 않은 앱」 경고는 확인하지 못했습니다.
체크박스에서 일부만 승인했을 때의 동작은 시험하지 않았습니다.
외부 도구가 「자기가 만든 시트만」 보는 범위로 연결됐을 때, 그 범위의 정확한 이름은 기록에 남아 있지 않습니다.
요약
| 본 것 | 뜻 | 확인할 것 |
|---|---|---|
| 같은 코드인데 권한 창이 두 번 | 트리거를 걸면 범위가 늘어남 | 개요 → Project OAuth Scopes |
| 「모든 Google Sheets 스프레드시트」 | 구글이 나누는 권한 단위 | 코드가 실제로 여는 시트 |
| 「Connect to an external service」 추가 | 바깥 주소를 부르는 줄이 생김 | 방금 바꾼 줄 |
| 「View and manage your forms」 추가 | 폼 제출 트리거를 걸었음 | 코드가 아니라 트리거 |
| 항목마다 체크박스 | 항목별로 승인 | 항목마다 필요한지 대조 |
| n8n 로그인에 drive 전체 | 바깥 도구가 정한 범위 | 로그인 창의 요청 범위 |
| 「Requested entity was not found.」 | 자기가 만든 파일만 보는 좁은 범위일 수 있음 | 주소보다 범위부터 |
| 「확인되지 않은 앱」 경고 없음 | 워크스페이스 계정 | 개인 계정은 다를 수 있음 |
권한 창은 코드가 무엇을 하려는지를 구글의 말로 다시 적어 주는 화면이었습니다. 겁낼 것은 항목이 넓은 것이 아니라, 항목과 코드가 하는 일이 맞지 않는 경우였습니다.
참고 (2026-09-23 확인)
– Google Apps Script 공식 문서 — Authorization scopes (developers.google.com/apps-script/concepts/scopes): 「Apps Script automatically determines required scopes by scanning the code for function calls.」 · 「Apps Script sometimes automatically assigns permissive scopes. This can mean your script asks users for more access than it needs.」 · 「Granular OAuth permissions allow users to authorize specific scopes」 · 개요의 「Project OAuth Scopes」에서 범위 확인
– Google Drive API 문서 — Choose Google Drive API scopes (developers.google.com/workspace/drive/api/guides/api-specific-auth): 「https://www.googleapis.com/auth/drive.file — Create new Drive files, or modify existing files, that you open with an app or that the user shares with an app while using the Google Picker API or the app’s file picker.」