기술 · 실용 가이드
Google Forms 체크박스 답변에 쉼표가 있을 때: 정확한 선택값 복원하기
Forms 자체 CSV와 원본 응답 배열 중 적합한 경로를 고르고, 필터링하거나 집계하기 전에 선택된 각 라벨을 확인하세요.

Google Forms 체크박스 응답이 엉뚱한 작업으로 나뉘거나 집계 결과가 의심스럽다면, 선택값이 어떤 과정을 거쳐 표에 들어왔는지 확인하세요. 쉼표로 이어 붙인 셀에서는 두 선택지 사이의 경계와 한 선택지 안의 문장부호를 구분하지 못할 수 있습니다. 분리 규칙을 하나 더 넣으면 표는 깔끔해 보여도 의미가 틀릴 수 있습니다.
먼저 양식 자체에서 CSV를 내려받아 실제 표현 방식을 확인하세요. 구분자로 필요한 값들을 구별할 수 없다면 원본 응답 배열로 돌아가야 합니다. 목표는 각 제출 건에서 선택된 라벨의 정확한 목록을 얻는 것입니다. 원본 정보를 이용할 수 없을 때 어디서 복원을 멈춰야 하는지도 분명히 해야 합니다.
표를 바꾸기 전에 원본 제출 내용 하나를 확인하기
편집 권한이 있는 계정으로 원본 양식을 열고 Responses → Individual을 선택하세요. 선택된 라벨에 쉼표가 들어 있는 제출 건 하나를 골라 선택지 전체를 적어 둡니다. 해당한다면 Email과 Email newsletter처럼 라벨의 문자열이 겹치는 제출 건도 고르세요. 이것이 앞으로 만들 표를 원본과 대조할 기준입니다. 현재 내보낸 파일은 그대로 두고 복사본으로 시험하세요.
실제 질문 유형을 확인하세요. 이 가이드는 한 질문에 여러 선택지로 답하는 일반 체크박스 질문을 다룹니다. 체크박스 그리드는 행 구조를 가지며 배열 형태도 다릅니다. 또한 필요한 것이 선택지별 개수인지, 특정 선택지를 포함한 제출 건 목록인지, 시각적인 요약인지 결정하세요. Forms의 기존 요약 화면으로 질문에 답할 수 있다면 내보내기는 불필요한 작업이 될 수 있습니다.
맞춤 내보내기를 만들기 전에 Forms 자체 CSV부터 시도하기
양식 자체에서 Responses → More → Download responses (.csv)를 사용하세요. 연결된 Google 스프레드시트를 CSV로 내려받는 것과는 다른 경로입니다. 2026년 2월에 갱신된 Displayr 연동 문서는 양식 자체 다운로드의 복수 응답 값이 세미콜론으로 구분된다고 설명합니다. 기존 Stack Overflow 답변도 같은 차이를 보고합니다. 따라서 라벨 안에 쉼표가 있다고 해서 그 자체 CSV 파일을 사용할 수 없는 것은 아닙니다.
CSV 형식을 이해하는 읽기 도구로 바깥쪽 CSV를 가져온 다음, 앞서 확인한 제출 건의 체크박스 필드를 살펴보세요. CSV 필드를 둘러싼 따옴표는 필드 전체를 하나로 유지하지만, 그 필드 안의 여러 선택지를 어떻게 인코딩하는지까지 지정하지는 않습니다. 실제 파일에서 내부 구분자와 이스케이프 방식을 확인하세요. 분리 규칙을 채택하기 전에 그 구분자가 들어 있는 라벨과 자유 입력 Other 답변을 시험해야 합니다. 얻은 선택값이 원본과 정확히 일치한다면 이 간단한 경로를 사용하세요. 연결된 시트가 다루기 불편해 보였다는 이유만으로 잘 작동하는 내보내기를 스크립트로 바꾸지 마세요. 제한 없는 Other 텍스트에 그 구분자가 들어갈 수 있고 신뢰할 만한 이스케이프 규칙을 확인할 수 없다면 원본 배열을 사용하세요.
분리와 텍스트 검색의 결과가 달라지는 이유 이해하기
허용된 라벨 네 개가 ["A", "A, B", "B, C", "C"]라고 해 봅시다. ["A, B", "C"]라는 선택과 ["A", "B, C"]라는 선택은 쉼표와 공백으로 연결하면 모두 A, B, C가 됩니다. 전체 선택지 목록을 알아도 이 두 결과 중 하나를 고를 수 없습니다. 이는 표현 방식을 설명하기 위한 가상 예시이며, 모든 Google 내보내기 형식에 대한 주장은 아닙니다.
텍스트 검색은 다른 오류를 만듭니다. 선택된 값이 ["Email newsletter", "Food, drinks"]라면, 연결된 문자열에서 Email을 찾을 때 선택하지 않은 항목까지 집계됩니다. 그 문자열을 쉼표와 공백으로 나눈 뒤 값 전체를 비교하면 이번에는 Food, drinks가 사라집니다. 우리는 이 두 반례를 로컬에서 실행했습니다. 실무에서 중요한 점은 집계하기 전에 선택값의 경계를 확정하는 것입니다. 부분 문자열 비교와 분리를 번갈아 적용한다고 경계가 확정되지는 않습니다.
원본 양식에서 선택값 배열 가져오기
Google의 Apps Script 참조 문서는 일반 CheckboxItem 응답을 선택된 값들을 담은 String[]로 정의합니다. 기존 Stack Overflow의 완전한 예제는 getResponses()를 읽고, 각 응답의 getItemResponses()를 순회하며, CHECKBOX 항목을 고른 뒤 getResponse()를 호출합니다. Apps Script를 사용한다면 양식의 More → Apps Script 메뉴에서 시작해 스크립트를 해당 양식에 연결하세요. 편집 권한이 필요합니다. 원본 예제는 아래 출처에 연결되어 있으며, API 메서드는 Google 문서에서 설명합니다.
그 체크박스 반복문 안에서 itemResponse.getResponse()가 반환한 배열을 그대로 유지하세요. values를 배열로 다루기 전에 Array.isArray(values)를 확인하고, 개별 문자열을 보존하는 텍스트 표현이 필요하면 JSON.stringify(values)를 사용합니다. 배열을 일반 문장처럼 이어 붙였다가 나중에 다시 나누려 하면 그 목적을 잃게 됩니다. 값과 함께 응답 ID와 항목 ID를 보관하세요. 질문 제목은 라벨이고 항목의 위치는 별도 속성입니다. Google은 체크박스 배열의 순서가 달라질 수 있다고도 설명합니다. 응답자가 클릭한 순서로 해석하지 마세요.
구조화된 페이지가 필요하면 공식 응답 API 사용하기
Forms REST API도 내부 구분자를 새로 정할 필요가 없는 공식 문서상의 경로입니다. 공식 forms.responses.list 참조에서 Try it을 열고, 해당 양식의 응답을 읽을 권한이 있는 계정을 사용해 편집기 URL의 양식 ID를 입력하세요. OAuth 토큰이나 요청 헤더를 복사하는 대신, 반환된 JSON을 응답 데이터로 저장합니다. forms.get 메서드는 양식 정의를 별도로 가져오므로 체크박스 질문의 questionId를 확인할 수 있습니다.
그 질문에서 선택된 각 값은 textAnswers.answers의 별도 항목으로 들어 있습니다. 저장한 페이지와 함께 responseId, questionId 매핑, 양식 ID를 보관하세요. list 메서드는 반환하는 각 응답 객체 안에 formId를 반복해서 넣지 않습니다. 이 REST 질문 ID는 해당 API의 데이터 모델에 속합니다. 다른 내보내기의 Apps Script 항목 ID로 대체하지 마세요.
첫 요청이 성공했다고 전체 내보내기가 끝난 것은 아닙니다. nextPageToken이 있으면 그 토큰과 동일한 양식, 동일한 필터로 다음 페이지를 요청하세요. 토큰이 없어질 때까지 계속합니다. 요청한 pageSize는 최댓값이며 서비스가 더 적은 수의 응답을 반환할 수도 있습니다. 모든 페이지를 보관하고 중복을 제외한 응답 ID를 확인한 뒤에 수집이 완료됐다고 판단하세요. 이 가이드는 실제 계정에서 내보내기를 실행했거나 트랜잭션으로 한 시점에 고정된 스냅샷을 얻었다고 주장하지 않습니다.
정확한 포함 여부로 집계하고 미응답은 별도로 유지하기
일반 체크박스 답변을 이미 배열로 얻었다면 values.includes("Food, drinks")는 그 라벨 전체가 선택됐는지 확인합니다. 다른 라벨의 일부와 일치시키지 않습니다. REST 표현에서는 선택한 답변의 textAnswers.answers에 .map(x => x.value)를 적용해 문자열을 얻은 다음, 같은 방식으로 정확한 포함 여부를 확인하세요. 그 라벨은 제출 건마다 최대 한 번만 집계합니다. 복수 선택 응답을 서로 다른 여러 사람으로 세지 마세요.
답변이 없는 경우는 별도 처리가 필요합니다. Apps Script는 이 유형의 미응답 항목을 getItemResponses() 결과에서 제외하므로, 배열 위치로 답변을 연결하면 뒤의 답변이 엉뚱한 질문에 붙을 수 있습니다. 대신 항목 ID나 질문 ID로 연결하세요. 체크박스 미응답을 명시적인 선택과 구별하고, 비율을 계산한다면 분모를 의도적으로 정해야 합니다. 답변이 없다는 사실만으로는 질문을 건너뛰었는지, 분기 때문에 지나갔는지, 나중에 추가됐는지 알 수 없습니다. 이 내보내기는 삭제된 과거 질문 정의도 복원하지 못합니다.
행 수뿐 아니라 실제 선택값과 대조하기
원본 제출 내용의 완전한 라벨을 복원한 배열이나 Forms 자체 CSV에서 해석한 필드와 대조하세요. 문장부호가 있는 라벨, 긴 라벨 안에 포함되는 짧은 라벨, 양식에서 허용한다면 자유 입력 값, 응답이 필수가 아닌 질문의 미응답을 포함합니다. 그런 다음 선택한 라벨 하나와 선택하지 않은 라벨 하나를 정확한 포함 여부 집계로 확인하세요. 전체 행 수가 맞아도 각 행 안의 선택값은 틀릴 수 있습니다.
로컬 Node 24.22.1에서 실행한 열 개의 검증문은 구분자 충돌, 두 가지 집계 오류, UTF-8 JSON 왕복 변환, 별도 항목 ID, 누락된 항목, 안전한 텍스트 처리를 다뤘습니다. 로컬 테스트 자료에서 문서에 정의된 Forms 객체 형태를 사용했습니다. Google Forms, Apps Script 승인 절차, 실제 CSV 내보내기, 로그인한 계정의 API Explorer는 실행하지 않았습니다. 응답을 계속 받는 양식이라면 합계를 비교하기 전에 내보낸 시각이나 선택한 응답 범위를 기록하고 새 제출 건을 고려하세요.
모호한 셀만 남았다면 불확실성을 보존하기
원본 양식 응답을 사용할 수 없어도 알려진 선택지 목록으로 해석을 하나로 좁힐 수 있는 경우는 있습니다. 하지만 항상 가능한 것은 아닙니다. A, B, C 예시는 두 가지 유효한 선택을 허용합니다. Other 자유 입력은 특정 구분자가 값에는 쓰이지 않을 것이라는 가정을 특히 불안정하게 만듭니다. 해결하지 못한 셀에는 검토가 필요하다는 표시를 남기고, 소유자에게 원본 응답이나 경계를 확인할 수 있는 다른 내보내기를 요청하세요.
정보가 하나의 문자열로 펼쳐진 뒤 쉼표를 세미콜론으로 바꿔도 그 정보가 복원되지는 않습니다. 셀 전체에 따옴표를 붙여도 마찬가지입니다. 승인한 변환이 있다면 원본 파일과 그 변환에 사용한 가정을 보관하세요. 작업을 배정하거나 집계 결과를 보고하는 데 사용하기 전에, 원본까지 추적할 수 있는 정확한 선택값 집합을 얻거나 미해결 기록을 분명히 표시하는 것이 완료 조건입니다.
