설문이나 신청서를 구글폼으로 받다 보면 응답이 어디에 쌓이는지, 새 응답이 들어왔는지 매번 폼을 열어 확인하게 됩니다. 이 번거로움을 덜어주는 게 구글폼 스프레드시트 자동 기록입니다. 폼과 시트를 한 번만 연결해두면 응답이 실시간으로 표에 정리되고, 여기에 알림까지 붙이면 새 응답이 들어올 때마다 메일로 바로 알려줍니다.
이 글에서는 코딩을 거의 하지 않는 방식부터 앱스스크립트로 알림을 좀 더 유연하게 다루는 방식까지 순서대로 짚어보겠습니다. 실제로 신청서를 운영하면서 걸렸던 함정도 같이 적어뒀습니다.
구글폼 응답을 스프레드시트에 자동으로 기록하기
가장 먼저 할 일은 폼과 시트를 연결하는 겁니다. 이 연결만 해두면 이후 모든 응답이 시트에 한 줄씩 알아서 추가됩니다. 저장 버튼을 누를 필요도, 복사해서 붙여넣을 필요도 없습니다.
- 구글폼 편집 화면 상단에서 응답 탭을 클릭합니다.
- 오른쪽 위 초록색 시트 아이콘을 누릅니다. 지금 UI에는 Sheets에 연결로 표기돼 있는데, 예전 화면에서는 스프레드시트에 연결로 보이기도 합니다. 둘은 같은 버튼입니다.
- 응답 저장 위치를 고르는 창이 뜨면 새 스프레드시트 만들기를 선택하고 이름을 정한 뒤 만들기를 클릭합니다. 이미 만들어둔 시트가 있으면 기존 스프레드시트 선택으로 붙일 수도 있습니다.
- 연결된 시트가 새 탭으로 열립니다. 기본 이름은 대개 ‘설문지 응답 시트1’입니다. 이제 폼에 응답이 들어올 때마다 이 시트에 한 행씩 자동으로 기록됩니다.

연결된 시트를 열어보면 첫 행에 타임스탬프와 각 질문 제목이 그대로 열 이름으로 들어가 있습니다. 타임스탬프는 응답이 제출된 시각인데, 폼이 알아서 채워주니 따로 신경 쓸 게 없습니다. 이메일 수집을 켜둔 폼이라면 이메일 주소 열도 함께 생깁니다.
시트에서 값을 직접 고쳐도 될까
연결된 시트에 담긴 값은 폼이 흘려보낸 것이라, 원본 응답을 시트에서 직접 손대는 건 권하지 않습니다. 오타 하나 고쳐놓아도 나중에 폼 질문을 수정하면 열이 어긋나면서 데이터가 밀릴 수 있습니다. 가공이 필요하면 원본 시트는 그대로 두세요. 새 탭을 하나 만들어 QUERY나 FILTER 함수로 걸러 보는 방식이 안전합니다. 원본은 폼이 채우는 대로 두고, 보기 좋은 형태는 따로 만드는 셈입니다.
새 응답이 오면 이메일로 알림받기
응답이 시트에 쌓여도 들어온 걸 모르면 소용이 없습니다. 알림 방법은 두 가지입니다. 하나는 폼 자체의 기본 알림이고, 다른 하나는 시트에 앱스스크립트를 붙이는 방법입니다. 어느 쪽이든 상황에 맞게 고르면 그만입니다.
방법 1. 폼 기본 알림 (코딩 없음)
가장 간단합니다. 구글폼 응답 탭에서 오른쪽 위 점 세 개 메뉴를 누르고 새 응답에 대한 이메일 알림 받기를 켜면 끝입니다. 그때부터 알림을 켠 본인 계정 메일로 “새 응답이 있습니다” 형태의 알림이 옵니다.
다만 이 알림에는 응답 내용이 담기지 않습니다. 알림을 받아도 무엇이 들어왔는지는 결국 폼을 열어 다시 확인해야 합니다. 받는 사람도 알림을 켠 본인 계정으로 고정입니다. “누가 신청했는지 제목만 봐도 알고 싶다”거나 “팀 공용 메일로 보내고 싶다”면 아래 앱스스크립트 방식이 낫습니다.
방법 2. 앱스스크립트로 내용까지 담아 보내기
연결된 스프레드시트에서 상단 메뉴 확장 프로그램 → Apps Script를 엽니다. 편집기가 뜨면 기본 코드를 지우고 아래를 붙여넣습니다.
function onFormSubmit(e) {
var to = "받는사람@example.com";
var values = e.values; // 이번 응답 한 줄이 배열로 들어옵니다
var body = values.join("\n");
MailApp.sendEmail(to, "새 폼 응답이 도착했습니다", body);
}
붙여넣었다고 끝이 아닙니다. 이 함수가 응답 제출 순간에 돌도록 트리거를 걸어줘야 합니다. 편집기 왼쪽의 시계 모양 아이콘(트리거)을 누르고 트리거 추가를 클릭한 다음, 실행할 함수를 onFormSubmit, 이벤트 소스를 스프레드시트에서, 이벤트 유형을 양식 제출 시로 지정하고 저장합니다. 처음 저장하면 구글 계정 권한 승인 창이 뜨는데, 본인 계정으로 끝까지 승인하면 됩니다.
직접 운영해보니 트리거 설정에서 사람들이 가장 많이 걸리는 데가 두 곳이었습니다. 하나는 이벤트 소스입니다. 폼이 아니라 스프레드시트에서로 골라야
e.values에 응답 내용이 배열로 제대로 담깁니다. 폼 쪽 트리거로 걸면 값 구조가 달라서 위 코드가 그대로 안 먹습니다. 다른 하나는 권한 승인입니다. 이걸 건너뛰면 트리거는 등록돼도 메일이 나가지 않습니다. 등록하자마자 폼에 테스트 응답을 한 번 넣어보고 메일이 오는지 꼭 확인하세요.
메일이 하루에도 수백 통씩 나가는 대량 폼이라면 발송 한도도 염두에 둬야 합니다. 앱스스크립트의 MailApp은 계정 유형에 따라 하루 발송량 한도가 정해져 있고, 개인 지메일 계정보다 회사 워크스페이스(Workspace) 계정 쪽이 넉넉합니다. 한도를 넘기면 그날은 메일 전송이 멈추니, 발송량이 많은 폼이라면 최신 공식 문서에서 본인 계정의 한도를 한 번 확인해두는 편이 좋습니다.
알림 방식 한눈에 비교
어느 쪽을 쓸지 헷갈린다면 아래 표를 보세요. 혼자 쓰는 간단한 폼이면 기본 알림으로 충분하고, 신청 내용을 바로 보고 싶거나 여러 명이 함께 받아야 하면 앱스스크립트 쪽이 낫습니다.
| 항목 | 폼 기본 알림 | 앱스스크립트 알림 |
|---|---|---|
| 설정 난이도 | 클릭 한 번 | 코드 붙여넣기 + 트리거 |
| 응답 내용 포함 | 없음 (폼 열어 확인) | 포함 가능 |
| 받는 사람 | 알림 켠 본인 계정 고정 | 원하는 주소로 지정 |
| 메일 제목·형식 | 고정 | 자유롭게 편집 |
| 슬랙 등 확장 | 불가 | 웹훅으로 확장 가능 |
슬랙이나 다른 채널로 보내고 싶다면
앱스스크립트에서는 MailApp 대신 UrlFetchApp.fetch()로 슬랙 웹훅 주소에 응답을 던질 수도 있습니다. 신청이 들어오면 팀 채널에 바로 뜨게 하는 식입니다. 웹훅 주소는 노출되면 안 되는 값이라, 코드에 그대로 박아두면 유출 위험이 있으니 스크립트 속성에 넣어 관리하세요. 참고로 회사 워크스페이스 계정은 관리자 정책에 따라 앱스스크립트 실행이나 외부 주소 호출이 막혀 있기도 합니다. 코드가 멀쩡한데도 안 돌아간다면 계정 권한부터 의심해보세요.
자주 묻는 질문
이미 응답이 쌓인 폼도 나중에 시트에 연결할 수 있나요?
됩니다. 연결하는 순간 그동안 받은 과거 응답이 한꺼번에 시트로 들어오고, 이후 응답도 계속 자동으로 추가됩니다. 처음부터 연결해두지 않았다고 데이터가 사라지지는 않습니다.
연결한 스프레드시트를 삭제하면 응답도 지워지나요?
시트를 지워도 폼 자체의 응답 데이터는 응답 탭에 그대로 남아 있습니다. 시트를 다시 연결하면 데이터를 되살릴 수 있습니다. 반대로 폼에서 응답을 삭제하면 원본이 사라지니 이쪽은 신중해야 합니다.
앱스스크립트 알림 메일이 안 와요.
대개 트리거의 이벤트 소스를 폼으로 잘못 골랐거나, 권한 승인을 마치지 않은 경우입니다. 트리거 설정에서 소스가 스프레드시트, 유형이 양식 제출 시로 돼 있는지 확인하고, 승인 창을 끝까지 통과했는지 점검하세요. 그래도 안 오면 스팸함과 하루 발송 한도 초과 여부도 함께 살펴보세요.
실시간으로 바로 기록되나요?
응답 제출과 시트 기록 사이에는 보통 지연이 거의 없지만, 트래픽이 몰리는 순간에는 몇 초 늦게 반영되기도 합니다. 알림도 대체로 바로 오지만 구글 서버 상황에 따라 조금 밀릴 때가 있습니다.
폼과 시트를 연결하고 알림 하나만 걸어두면 신청서를 온종일 들여다보는 수고가 사라집니다. 처음엔 기본 알림으로 시작하고, 응답 내용을 바로 보거나 팀과 나눠야 할 일이 생기면 그때 앱스스크립트로 넘어가면 됩니다. 시트에 쌓인 데이터는 그다음 단계에서 함수나 GPT 연동으로 얼마든지 가공할 수 있습니다.
공식 참고: Google 설문지 응답 고객센터
관련 글
버튼 하나로 반복 작업을 처리하고 싶다면 노션 버튼으로 반복 작업 자동화하기를, 시트에 쌓인 응답을 AI로 분석하고 싶다면 구글 시트에서 GPT로 데이터 다루기를 함께 보면 도움이 됩니다.