표 파일로 문서 만들기

템플릿에서 만들어진 양식을 내려받아 엑셀이나 CSV 로 채우고 올리세요. doc 시트의 한 행이 PDF 한 장이 됩니다. 생성 전에 전부 검사하고, 한 칸이라도 틀리면 한 장도 만들지 않습니다.

양식 받기

템플릿을 열고 "표 파일로 만들기"에서 엑셀 양식 또는 시트마다 CSV 하나를 내려받습니다. 양식은 템플릿에서 만들어집니다. 시트 수는 템플릿이 배열을 몇 겹 쓰느냐가 정합니다. 배열이 없으면 한 장(doc), data.items 표가 있으면 두 장(doc·items), 블록 안에 표가 있으면 세 장입니다.

1행은 헤더이자 대조 키입니다 — 고치지 마세요. 2행은 열 설명, 3행은 예시이고 둘 다 업로드 시 무시됩니다. 4행부터 입력합니다. 엑셀 파일에는 템플릿과 잇는 숨김 시트가 함께 있습니다.

채우기

모든 시트의 A열은 _key, 문서 키입니다 — 예를 들면 청구서 번호. 문서마다 달라야 하고, 시트 사이에서 한 문서의 행들을 잇는 것이 이 값입니다. 템플릿이 보는 데이터에는 들어가지 않습니다.

세 번째 시트(반복 블록 안의 표)에는 B열에 _row 도 있습니다. 같은 _key 를 가진 부모 행 중 몇 번째인지, 1부터 셉니다. 두 번째 시트는 _key 만 있으면 되고 순서는 파일 순서입니다.

빈 칸은 누락입니다. 템플릿이 그 값을 쓰면 생성이 멈추고 그 칸을 짚어 줍니다. 비워도 되는 열은 템플릿에서 기본값을 주세요: {{ data.memo || "" }}.

숫자는 숫자만 — 쉼표·통화 기호 없이. "1,000" 은 문자로 남아 계산에서 걸립니다. 날짜는 YYYY-MM-DD. 엑셀의 숫자·날짜 셀은 그 타입이 유지되고, CSV 에서는 숫자로 완전히 읽히는 값만 숫자가 됩니다.

CSV 는 시트마다 파일 하나입니다. 이름은 brewmypdf_(템플릿ID)_(양식해시)_(시트).csv 이고 바꾸지 마세요 — 엑셀 양식은 숨김 시트가 템플릿을 알려 주지만, CSV 는 파일 이름이 유일한 단서입니다. 한국 엑셀이 EUC-KR 로 저장한 파일도 UTF-8 과 함께 읽습니다.

예시 — 인보이스 120장

이 절 하나만 읽어도 됩니다. 인보이스를 예로 들어, 표 파일이 어떻게 문서가 되는지 끝까지 따라가 봅니다.

왜 시트가 나뉘나요? 인보이스 한 장에는 성격이 다른 두 가지가 들어 있기 때문입니다. 회사명·담당자·발행일처럼 한 장에 하나씩만 있는 값이 있고, 줄 항목처럼 몇 개가 될지 모르는 것이 있습니다. 앞의 것은 칸이 정해져 있지만 뒤의 것은 그렇지 않습니다 — 어떤 인보이스는 줄이 2개고 어떤 것은 40개입니다. 이것을 한 행에 넣으려면 품목1, 수량1, 단가1, 품목2, 수량2… 처럼 열을 미리 만들어 둬야 하고, 그러면 가장 긴 인보이스에 맞춰 빈 열이 수백 개 생깁니다. 그래서 되풀이되는 것은 시트를 따로 둡니다. 한 줄이 한 행이면 몇 개든 적을 수 있습니다.

템플릿이 회사명·담당자 같은 값과 줄 항목 표를 함께 쓰면, 양식은 이렇게 두 장으로 나옵니다. doc 시트의 한 행이 인보이스 한 장이고, items 시트의 한 행이 그 인보이스의 줄 하나입니다.

양식 받기
doc 시트
  _key      invoice_no    date        company      contact
  INV-001   INV-2026-01   2026-09-01  Acme Ltd.    김철수      ← 인보이스 1
  INV-002   INV-2026-02   2026-09-01  Northwind    田中        ← 인보이스 2
  …
  INV-120   INV-2026-120  2026-09-30  Societe SA   Dupont      ← 인보이스 120

items 시트
  _key      name          qty   price
  INV-001   컨설팅 9월      1     3000000   ┐
  INV-001   서버 임대       3      120000   ├ 인보이스 1 의 줄 8개
  INV-001   … 여섯 줄 더                    ┘
  INV-002   디자인 작업     1     1500000   ┐ 인보이스 2 의 줄 2개
  INV-002   수정 2회        2       80000   ┘
  …

두 시트를 잇는 것이 A열의 _key 입니다. items 시트에서 _key 가 INV-001 인 행을 모두 모아 그 인보이스의 줄 항목이 됩니다. 값은 무엇이든 좋지만 인보이스마다 달라야 합니다 — 인보이스 번호를 쓰면 편합니다. 이 값은 문서에 인쇄되지 않습니다. 행을 잇기 위한 이름표일 뿐입니다.

생성 버튼을 누르면 doc 시트의 행마다 이런 일이 일어납니다.

생성과 내려받기
doc 시트 1행  ─┐
                ├─→  { invoice_no: 'INV-2026-01',
items 시트       │       company: 'Acme Ltd.',
  INV-001 의 8행 ─┘       items: [ 줄 8개 ] }
                                    │
                                    ▼
                            템플릿 + 데이터
                                    ▼
                       INV-001.pdf  (2~3쪽)  = 1 크레딧

그래서 doc 시트가 120행이면 PDF 가 120개 나옵니다. items 시트가 960행이어도 마찬가지입니다 — 그 960행은 120장 안에 나뉘어 들어갑니다. 크레딧도 120 입니다. 인보이스 한 장이 2쪽이든 3쪽이든 크레딧은 1 입니다 — 쪽수는 세지 않습니다. 정리하면, 크레딧은 언제나 doc 시트의 행 수입니다.

시트가 세 장이 되는 경우도 있습니다. 인보이스 여러 장을 한 PDF 로 묶고 그 안에 각각 줄 항목이 있는 템플릿이 그렇습니다 — 되풀이 안에 되풀이가 있으므로 doc · 인보이스 · 줄항목 세 장이 됩니다. 이때 셋째 시트에는 _row 열이 하나 더 있습니다. 같은 _key 안에서 몇 번째 인보이스에 붙는 줄인지 1부터 세어 적습니다. 되풀이는 여기까지입니다 — 네 겹은 표로 펼 수 없어 양식을 만들지 않습니다.

무엇을 검사하나

검사는 브라우저에서 돕니다. 파일은 서버로 가지 않습니다. 양식이 현재 템플릿의 것인지, 헤더가 기대한 열과 맞는지, 키(빈 키·중복·고아)와 행 한도를 봅니다. 그다음 문서마다 실제 렌더러와 같은 방식으로 컴파일해서 템플릿이 쓸 수 없는 값을 짚습니다. 빈 칸, 계산 자리의 문자, 100쪽 초과가 그것입니다.

지적 하나하나가 시트·행·열을 말합니다. 하나라도 있으면 생성 버튼이 나타나지 않습니다. 파일을 고쳐 다시 올리세요.

생성과 내려받기

검사가 끝나면 첫 문서를 미리 보여 주고, 그 위 요약 줄에 문서 수·쪽수·크레딧이 적힙니다. 생성 버튼에는 만들 건수가 적힙니다. 문서는 50건씩 한 실행으로 접수됩니다. 화면에 완료·진행·대기·실패 수와 완료된 문서마다 내려받기 링크가 보입니다.

접수가 도중에 멈추면(쿼터·큐 예산) 이미 접수된 문서는 만들어지고, 실행은 그 지점에서 실패로 표시되며, 다시 올려 나머지를 접수할 수 있습니다. 실행이 조용히 잘리는 일은 없습니다. ⚠ 크레딧은 50건 묶음 단위로 봅니다 — 남은 크레딧이 묶음보다 적으면 그 묶음은 한 건도 만들지 않습니다. 잔여 30건에 100건을 올리면 첫 묶음 50건만 만들어지고 거기서 멈춥니다. 남은 크레딧을 정확히 쓰려면 잔여 수만큼 잘라서 올리세요. 실행이 끝나면 완료된 문서를 ZIP 하나로 묶어 받을 수 있습니다 — 합계 500MB 까지이고, 넘으면 묶지 않으므로 개별 링크로 받으세요.

반복 실행 (정기 수집)

표를 매번 손으로 올리는 대신, 데이터 주소를 등록해 두면 정해진 때에 시스템이 그 주소에서 표를 가져와 문서를 만듭니다. 구글 스프레드시트의 “웹에 게시” CSV 링크, 사내 서버의 내보내기 주소처럼 로그인 없이 열리는 https 주소여야 합니다.

주기는 매일 · 매주 ○요일 · 매월 N일 중 하나에 시각과 시간대를 더해 정합니다. 크론 문법은 쓰지 않습니다. 시간대를 저장하므로 서머타임이 있는 지역에서도 현지 시계 기준으로 같은 시각에 돕니다. 없는 날짜(2월 31일 등)는 그 달의 마지막 날로 처리합니다.

등록하는 순간 주소를 한 번 열어 검사합니다. 통과하지 못하면 저장하지 않습니다 — 한 달 뒤 첫 회차에서 처음 실패를 알게 되는 일이 없도록 하기 위해서입니다.

회차마다 업로드와 똑같은 검사를 거칩니다. 하나라도 걸리면 한 장도 만들지 않고 그 회차를 실패로 남기며 이메일로 알립니다. 크레딧은 쓰이지 않습니다. 성공은 알리지 않습니다.

같은 회차는 한 번만 돕니다. 연속 3번 실패하면 자동으로 꺼지고 그 사실을 알립니다. 템플릿을 고치면 등록해 둔 양식과 어긋나므로 반복 실행을 지우고 다시 만들어야 합니다.

주기의 최소 단위는 하루입니다(시간·분 단위는 없습니다). 정해진 시각보다 늦게 시작합니다 — 보통 1분 남짓, 최대 6분입니다. 5분 간격으로 도는 검사에 걸리는 시간과 클라우드 쪽 실행 지연이 더해진 값입니다. 한 회차에 문서 500건까지이며(직접 올릴 때의 1,000건보다 적습니다), 주소 하나당 10MB, 응답 대기 20초, 리다이렉트 3번까지입니다. 켤 수 있는 반복 실행 수는 플랜의 템플릿 수와 같습니다. 비공개 소스(로그인·토큰이 필요한 주소)는 아직 지원하지 않습니다.

한도

한 번에 문서 1,000건, 파일 10MB 까지입니다. ZIP 은 합계 500MB 까지입니다. 배열은 두 겹까지(블록 + 표, 또는 블록 두 겹)이며 세 겹인 템플릿은 양식을 만들 수 없습니다. 문서마다 100쪽 한도와 플랜 쿼터가 그대로 적용됩니다 — 문서 하나가 렌더 하나이고, 쪽수는 세지 않습니다. 크레딧은 50건 묶음 단위로 판정합니다(위 참고).