시트 값이 코드로 넘어가면 달라지는 것 — 날짜, 빈 칸, 열 순서, 한글

시트에 보이는 값과 코드가 받는 값은 같지 않았습니다. 시트에는 2026-09-14라고 적혀 있는데 코드에는 「Mon Sep 14 00:00:00 GMT+09:00 2026」이 오고, 비교하면 한 줄도 안 맞았습니다. 폼에 칸을 하나 넣었더니 시트에서는 엉뚱한 자리에 붙었습니다. 보낸 이름이 받는 쪽에서는 비어 있었습니다.

구글 시트·폼·Apps Script·n8n으로 자동화를 네 번 만드는 동안, 코드가 틀려서 막힌 것보다 값의 모양이 달라서 막힌 것이 더 많았습니다. 날짜, 빈 칸, 열 순서, 한글. 이 글은 그 네 가지를 모은 것입니다.

1. 날짜 — 보이는 대로 오지 않습니다

시트에 줄이 차면 메일을 보내는 자동화를 처음 만들었을 때, 메일 본문의 날짜가 이렇게 왔습니다.

Sat Sep 12 2026 00:00:00 GMT+0900 (Korean Standard Time) | (이름) | 테스트 문의

시트에는 2026-09-12로 보이는 칸입니다. 값을 읽는 getValues()가 날짜 칸을 날짜 객체로 가져오고, 그걸 글자로 붙이면 저 모양이 됩니다. getDisplayValues()로 바꾸자 시트에 보이는 그대로 2026-09-12가 왔습니다.

공식 문서도 두 함수를 이렇게 구분합니다. getValues()는 「The values may be of type Number, Boolean, Date, or String, depending on the value of the cell.」이고, getDisplayValues()는 「The values are String objects. The displayed value takes into account date, time and currency formatting」입니다. 하나는 값의 종류를 살려서 주고, 하나는 화면에 보이는 글자로 줍니다.

더 곤란했던 것은 매일 아침 보고 메일을 만들 때였습니다. 어제 날짜 줄만 골라 합치는 코드였는데, 첫 메일의 합계가 0건이었습니다.

시트에는 9월 14일 줄이 다섯 개 있었습니다. 실행 로그에 줄마다 값을 찍어 보니 이랬습니다.

raw=Mon Sep 14 00:00:00 GMT+09:00 2026 type=[object Date] fmt=- isDate=false

날짜 객체가 맞는데([object Date]), 코드의 「날짜인가」 검사(instanceof Date)가 false였습니다. 그래서 스무 줄이 전부 「날짜가 아닌 줄」로 걸러졌습니다. 이유는 공식 문서에서 찾지 못했고, 그 시트에서 스무 줄 전부 그랬다는 것만 확인했습니다. 고친 것은 한 줄입니다. getDisplayValues()로 글자를 받아 ‘2026-09-14’와 글자끼리 비교했고, 합계 17건이 맞게 왔습니다.

대신 이 방법에는 대가가 있습니다. 시트의 표시 서식에 기댑니다. 일자 칸을 누군가 9/14처럼 보이게 서식을 바꾸면, 코드는 ‘2026-09-14’를 찾다가 한 줄도 못 잡습니다. 그래서 일자 칸의 서식을 연-월-일로 고정해 두었습니다.

2. 폼이 넣은 날짜는 또 다릅니다

구글 폼으로 문의를 받아 시트에 쌓이게 하고, 제출될 때마다 알림을 보내게 만들었을 때입니다. 폼 제출 트리거가 넘겨주는 값(e.values)의 첫 칸, 타임스탬프는 이미 글자였습니다.

2026. 9. 14 오후 9:35:36

getValues()처럼 날짜 객체가 오는 것이 아니고, 모양도 시트에서 보는 것과 다릅니다. 같은 「날짜」인데 어디서 읽느냐에 따라 날짜 객체, 서식대로의 글자, 폼이 만든 글자, 세 가지로 왔습니다. 날짜를 비교하거나 계산하는 코드라면, 그 값이 어디서 왔는지부터 확인해야 했습니다.

3. 빈 칸 — 없는 것이 아니라 빈 글자입니다

빈 칸은 null이나 「없음」이 아니라 빈 문자열(”)로 옵니다. 공식 문서도 두 함수 모두 「Empty cells are represented by an empty string in the array.」라고 적고 있습니다.

이게 쓸모가 있었습니다. 시트 알림에서 「줄이 다 찼을 때만 보낸다」는 판단을 이 빈 문자열로 했습니다. 세 칸 중 하나라도 ”이면 아직 덜 찬 줄로 보고 건너뛰었습니다. 셀 단위로 발동하는 트리거 때문에 한 줄에 메일이 세 통 오던 것을 이걸로 막았습니다.

폼에서도 같았습니다. 필수가 아닌 칸을 비우고 제출하면 e.values의 그 자리에는 빈 문자열이 옵니다. 필수가 아닌 칸은 늘 이렇게 올 수 있으니, 코드가 빈 값을 받아도 깨지지 않게 해 두는 편이 낫습니다.

숫자도 한 가지 조심할 것이 있었습니다. getDisplayValues()로 받으면 숫자도 글자로 옵니다. 보고 메일에서 건수를 더할 때는 Number()로 바꾼 뒤 더했습니다. 글자끼리 더하면 합계가 아니라 이어 붙인 글자가 됩니다.

4. 열 순서 — 폼 중간에 넣은 칸은 시트 맨 끝에 붙습니다

문의 폼을 만들어 시험하면서 「이름」 다음에 「회사명」 칸을 끼워 넣어 봤습니다. 폼에서는 두 번째 칸입니다. 제출했더니 시트에서는 맨 끝 열에 붙었습니다. 기존 열은 자리를 지켰고 새 열만 뒤에 붙었습니다. 그 제출의 e.values는 이런 모양이었습니다(이름과 회사명은 자리표시로 바꿨습니다).

["2026. 9. 14 오후 10:22:45","(이름)","(연락처)","(문의 내용)","(회사명)"]

번호로 읽는 코드(v[1]이 이름)는 이 상황에서 깨지지 않았습니다. 이름은 여전히 두 번째니까요. 대신 새로 넣은 회사명은 메일에 실리지 않았습니다. 「이름」 앞에 칸을 넣었다면 어떻게 되는지는 시험하지 못했습니다.

그래서 번호 대신 열 이름으로 읽게 바꿨습니다. 폼 제출 트리거는 values와 함께 namedValues도 넘겨줍니다. 공식 문서의 설명은 이렇습니다.

값 공식 문서 설명
values 「Array with values in the same order as they appear in the spreadsheet.」
namedValues 「An object containing the question names and values from the form submission.」

values는 시트의 열 순서를 따르고, namedValues는 질문 이름으로 찾습니다. 열 순서가 바뀌어도 namedValues로 읽은 코드는 그대로 돌았습니다.

다만 열 이름은 폼의 질문 제목 그대로입니다. 누가 질문 제목을 바꾸면 코드가 찾는 이름이 사라집니다. 그리고 폼에서 질문을 지워도 시트의 열은 지워지지 않고 남았습니다. 그 열을 시트에서 직접 지우면 이후 제출이 어느 열로 들어오는지는 확인하지 못했습니다.

구글 폼 중간에 추가한 「회사명」 질문이 응답 시트에서는 맨 끝 E열에 붙고 기존 열은 자리를 지키는 모습

5. 한글 — 보내는 쪽에서 깨집니다

시트 알림을 n8n 쪽으로 옮겨 볼 때, 시트 대신 이 PC의 터미널에서 n8n 웹훅을 불러 시험했습니다. 첫 시도에서 메일의 이름 칸이 비어 왔습니다. 받은 원문을 보니 한글이 전부 깨져 있었습니다.

n8n 문제가 아니었습니다. 윈도우 터미널이 한글을 다른 인코딩으로 보냈고, n8n은 UTF-8로 읽었습니다. 보낼 내용을 UTF-8 파일로 만들어 보내니 정상이었습니다. 실제로 시트에서 부를 때는 구글 쪽이 보내는 것이라 이 문제가 없을 것으로 봤지만, 그 구간은 끝내 시험하지 못했습니다.

시험할 때 쓰는 도구가 실제 운영과 다른 방식으로 값을 보낼 수 있다는 것, 그리고 「이름이 비어 온다」의 원인이 받는 쪽이 아니라 보내는 쪽일 수 있다는 것이 여기서 배운 것입니다.

값을 다룰 때 점검표

  1. 날짜를 비교하려면 어디서 읽는지부터 정합니다. getValues(날짜 객체), getDisplayValues(서식대로의 글자), 폼 e.values(폼이 만든 글자)
  2. 서식에 기대는 코드라면 그 칸의 서식을 고정합니다
  3. 빈 칸은 ”로 옵니다. 「다 찼는지」 판단에 쓰고, 빈 값에 깨지지 않게 합니다
  4. 글자로 받은 숫자는 숫자로 바꾼 뒤 더합니다
  5. 폼에서 온 값은 번호보다 이름(namedValues)으로 읽습니다. 질문 제목을 바꾸면 코드도 바꿉니다
  6. 한글이 비거나 깨지면 받는 쪽보다 보내는 쪽의 인코딩부터 봅니다

이 글이 다루지 않은 것

instanceof Date가 false가 된 이유는 찾지 못했습니다. 그 시트에서 그랬다는 것까지입니다.

폼에서 첫 칸 앞에 질문을 넣는 경우, 시트에서 열을 지운 뒤의 동작, 시트에서 n8n으로 부를 때의 한글은 확인하지 못했습니다.

요약

값 겪은 것 대처
날짜 (getValues) 「Sat Sep 12 2026 00:00:00 GMT+0900…」 getDisplayValues
날짜 비교 instanceof Date 가 false, 합계 0건 글자끼리 비교, 서식 고정
폼 타임스탬프 이미 글자, 「2026. 9. 14 오후 9:35:36」 출처별로 모양 확인
빈 칸 빈 문자열(”) 「다 찼는지」 판단에 사용
숫자 getDisplayValues 는 글자 Number()로 바꿔 더함
폼에 칸 추가 시트 맨 끝 열에 붙음 namedValues 로 이름으로 읽기
한글 이름 칸이 비어 옴 보내는 쪽을 UTF-8 로

코드는 시트를 보지 않습니다. 시트가 넘겨주는 값을 볼 뿐이고, 그 값은 보이는 것과 모양이 달랐습니다.

참고 (2026-09-23 확인)
– Google Apps Script 공식 문서 — Class Range (developers.google.com/apps-script/reference/spreadsheet/range): getValues() 「The values may be of type Number, Boolean, Date, or String, depending on the value of the cell. Empty cells are represented by an empty string in the array.」 · getDisplayValues() 「The values are String objects. The displayed value takes into account date, time and currency formatting, including formats applied automatically by the spreadsheet’s locale setting.」
– Google Apps Script 공식 문서 — Event objects, Google Sheets 「Form submit」 (developers.google.com/apps-script/guides/triggers/events): namedValues 「An object containing the question names and values from the form submission.」 · values 「Array with values in the same order as they appear in the spreadsheet.」

Leave a Comment