表ファイルからドキュメントを作る

テンプレートから作られた入力フォームをダウンロードし、Excel または CSV で記入してアップロードします。doc シートの 1 行が PDF 1 通になります。作成前にすべて検査し、1 つのセルでも誤りがあれば 1 通も作りません。

フォームを受け取る

テンプレートを開き「表ファイルから作る」でExcelフォーム、またはシートごとに CSV を 1 つダウンロードします。フォームはテンプレートから生成されます。シートの枚数は、テンプレートが配列を何重に使っているかで決まります。配列がなければ 1 枚(doc)、data.items の表があれば 2 枚(doc・items)、ブロックの中に表があれば 3 枚です。

1 行目はヘッダーであり照合キーです — 変更しないでください。2 行目は各列の説明、3 行目は記入例で、どちらもアップロード時は無視されます。4 行目から入力します。Excel ファイルには、テンプレートと結びつける隠しシートも入っています。

記入する

すべてのシートの A 列は _key、ドキュメントキーです — たとえば請求書番号です。ドキュメントごとに異なる値である必要があり、シートをまたいで 1 通分の行を結び付けるのがこの値です。テンプレートが見るデータには含まれません。

3 枚目のシート(繰り返しブロックの中の表)には、B 列に _row もあります。同じ _key を持つ親行のうち何番目かを 1 から数えて記入します。2 枚目のシートは _key だけでよく、順序はファイルの並び順です。

空のセルは「値がない」という意味です。テンプレートがその値を使っている場合は作成が止まり、そのセルを指し示します。空欄でもよい列は、テンプレート側で既定値を与えてください: {{ data.memo || "" }}。

数値は数字だけで — 桁区切りや通貨記号は入れないでください。"1,000" は文字列のまま残り、計算でつまずきます。日付は YYYY-MM-DD です。Excel の数値セル・日付セルはその型が保たれ、CSV では完全に数値として読める値だけが数値になります。

CSV はシートごとに 1 ファイルで、名前は brewmypdf_(テンプレートID)_(フォームハッシュ)_(シート).csv です。この名前は変更しないでください — Excel フォームは隠しシートがテンプレートを伝えますが、CSV はファイル名が唯一の手がかりです。韓国版 Excel が EUC-KR で保存したファイルも、UTF-8 と併せて読み取ります。

実例 — 請求書 120 通

この節だけ読んでも構いません。請求書を例に、表ファイルがどうやってドキュメントになるのかを最後までたどります。

なぜシートが分かれるのでしょうか。請求書 1 通の中には、性質の異なる 2 種類のものが入っているからです。会社名・担当者・発行日のように 1 通に 1 つだけある値と、明細のように何個になるか分からないものです。前者は枠が決まっていますが、後者はそうではありません — ある請求書は明細が 2 行、別の請求書は 40 行です。これを 1 行に収めようとすると、品目1・数量1・単価1・品目2・数量2… のように列をあらかじめ作っておく必要があり、いちばん長い請求書に合わせて空の列が何百も並ぶことになります。ですから、繰り返されるものはシートを分けます。1 行が 1 明細なら、いくつでも書けます。

テンプレートが会社名・担当者のような値と明細の表を一緒に使っている場合、フォームはこのように 2 枚で出てきます。doc シートの 1 行が請求書 1 通、items シートの 1 行がその請求書の明細 1 行です。

フォームを受け取る
doc シート
  _key      invoice_no    date        company      contact
  INV-001   INV-2026-01   2026-09-01  Acme Ltd.    Kim         <- 請求書 1
  INV-002   INV-2026-02   2026-09-01  Northwind    Tanaka      <- 請求書 2
  ...
  INV-120   INV-2026-120  2026-09-30  Societe SA   Dupont      <- 請求書 120

items シート
  _key      name             qty   price
  INV-001   Consulting Sep     1   3000000   -+
  INV-001   Server rental      3    120000    | 請求書 1 の明細 8 行
  INV-001   ... 残り 6 行             -+
  INV-002   Design work        1   1500000   -+ 請求書 2 の明細 2 行
  INV-002   Revisions x2       2     80000   -+
  ...

2 枚のシートを結び付けるのが A 列の _key です。items シートで _key が INV-001 の行をすべて集めたものが、その請求書の明細になります。値は何でも構いませんが、請求書ごとに異なる必要があります — 請求書番号を使うと分かりやすいです。この値はドキュメントには印字されません。行を結ぶための名札にすぎません。

作成ボタンを押すと、doc シートの行ごとに次のことが起こります。

作成とダウンロード
doc シート 1 行  -+
                   +-->  { invoice_no: 'INV-2026-01',
items シート,      |        company: 'Acme Ltd.',
  INV-001 の 8 行 -+        items: [ 明細 8 行 ] }
                                    |
                                    v
                        テンプレート + データ
                                    |
                                    v
                  INV-001.pdf  (2〜3 ページ)  = 1 クレジット

ですから doc シートが 120 行なら PDF は 120 個できます。items シートが 960 行あっても同じです — その 960 行は 120 通の中に分かれて入ります。クレジットも 120 です。請求書 1 通が 2 ページでも 3 ページでもクレジットは 1 です — ページ数は数えません。まとめると、クレジットは常に doc シートの行数です。

シートが 3 枚になる場合もあります。複数の請求書を 1 つの PDF にまとめ、そのそれぞれに明細があるテンプレートがそうです — 繰り返しの中に繰り返しがあるので、doc・請求書・明細の 3 枚になります。このとき 3 枚目のシートには _row 列が 1 つ増えます。同じ _key の中で何通目の請求書に属する明細かを 1 から数えて記入します。入れ子はここまでです — 4 重は表として展開できないため、フォームを作りません。

何を検査するのか

検査はブラウザ上で行われます。ファイルはサーバーに送られません。フォームが現在のテンプレートのものか、ヘッダーが期待する列と合っているか、キー(空・重複・孤立)と行数の上限を見ます。そのうえで、ドキュメントごとに実際のレンダラーと同じ方法でコンパイルし、テンプレートが使えない値を指し示します。空のセル、計算すべき箇所の文字列、100 ページ超過がそれにあたります。

指摘の 1 つ 1 つがシート・行・列を示します。1 つでもあれば作成ボタンは出てきません。ファイルを直して、もう一度アップロードしてください。

作成とダウンロード

検査が終わると最初のドキュメントをプレビューし、その上の要約行にドキュメント数・ページ数・クレジットが表示されます。作成ボタンには作る件数が表示されます。ドキュメントは 50 件ずつ 1 つの実行として受け付けられます。画面には完了・実行中・待機・失敗の件数と、完了したドキュメントごとのダウンロードリンクが表示されます。

受け付けが途中で止まった場合(クォータ・キュー予算)、すでに受け付けたドキュメントは作られ、実行はその時点で失敗として記録されます。もう一度アップロードして残りを受け付けることができます。実行が黙って打ち切られることはありません。⚠ クレジットは 50 件のまとまり単位で判定します — 残りのクレジットがまとまりより少ない場合、そのまとまりは 1 件も作りません。残り 30 クレジットで 100 行をアップロードすると、最初の 50 件だけが作られてそこで止まります。残りのクレジットをちょうど使い切るには、残数と同じ行数だけを切り出してアップロードしてください。実行が終わると、完了したドキュメントを 1 つの ZIP にまとめて受け取れます — 合計 500 MB までで、超える場合はまとめませんので個別のリンクからお受け取りください。

定期実行

毎回手で表をアップロードする代わりに、データの URL を登録しておくと、決められた時刻にシステムがその URL から表を取得してドキュメントを作ります。Google スプレッドシートの「ウェブに公開」CSV リンクや、社内サーバーのエクスポート URL のように、ログインなしで開ける https の URL である必要があります。

周期は毎日・毎週◯曜日・毎月 N 日のいずれかに、時刻とタイムゾーンを加えて決めます。cron の文法は使いません。タイムゾーンを保存するため、夏時間のある地域でも現地の時計で同じ時刻に動きます。存在しない日付(2 月 31 日など)は、その月の最終日として扱います。

登録したその場で URL を一度開いて検査します。通らなければ保存しません — 1 か月後の初回実行ではじめて失敗に気づく、ということがないようにするためです。

各回の実行は、アップロードとまったく同じ検査を通ります。1 つでも引っかかれば 1 通も作らず、その回を失敗として記録し、メールでお知らせします。クレジットは使われません。成功はお知らせしません。

同じ回は一度だけ実行されます。3 回続けて失敗すると自動的に停止し、そのことをお知らせします。テンプレートを変更すると登録済みのフォームと合わなくなるため、定期実行を削除して作り直してください。

周期の最小単位は 1 日です(時間・分単位はありません)。決められた時刻より遅れて始まります — 通常は 1 分ほど、最大で 6 分です。5 分間隔で回る点検までの待ち時間に、クラウド側の実行遅延が加わった値です。1 回あたり最大 500 件(手でアップロードするときの 1,000 件より少なくなっています)、URL 1 つあたり 10 MB、応答待ち 20 秒、リダイレクト 3 回までです。有効にできる定期実行の数は、ご利用プランのテンプレート数と同じです。非公開のソース(ログインやトークンが必要な URL)にはまだ対応していません。

上限

一度に作れるのはドキュメント 1,000 件、ファイル 10 MB までです。ZIP は合計 500 MB までです。配列は 2 重まで(ブロック + 表、またはブロック 2 重)で、3 重のテンプレートはフォームを作れません。ドキュメントごとに 100 ページの上限とプランのクォータがそのまま適用されます — ドキュメント 1 つがレンダー 1 回であり、ページ数は数えません。クレジットは 50 件のまとまり単位で判定します(上記参照)。