Skip to content

Template Filler

Fills a {{placeholder}} template once per row of a table and returns one document per row.

A mail merge without the mail: a template with {{column}} placeholders, a table pasted from a spreadsheet, and one filled-out document per row. There are no conditionals or loops, deliberately — what a merge needs is "format this number" and "put something here if it is blank".

🔒 Runs entirely in your browsertemplatemail-mergebatch

Template

Placeholders are {{column}}. Add a filter after a pipe: {{amount | won}}, {{name | default: 고객}}.

Data

Paste straight from a spreadsheet — the first row is the header. Tab-separated by default; commas with quoted fields also work.

3 documents

rows

3

columns used

3

columns unused

0

rows with a gap

0

  • Row 1

    Dear Kim Minjun, Please pay 1,250,000원 by 2026-09-01. Thank you.

  • Row 2

    Dear Lee Seoyeon, Please pay 480,000원 by 2026-09-05. Thank you.

  • Row 3

    Dear Park Doyun, Please pay 0원 by 2026-09-10. Thank you.

Filters

  • upper — UPPER CASE
  • lower — lower case
  • title — Title Case
  • trim — Remove surrounding spaces
  • number — Thousands separators: 1234567 → 1,234,567
  • won — Korean currency: 1234567 → 1,234,567원
  • default: text — Use this when the cell is empty
  • pad: 5 — Pad with leading zeros to a width
There are no conditionals or loops here on purpose. A template language with control flow is a programming language that has to be documented and sandboxed; what a merge actually needs is "format this number" and "put something here if it is blank".

How to use it

  1. Write the template

    Placeholders are {{column}}, matching the header row of your table. A filter goes after a pipe: {{amount | won}} formats a number, {{name | default: 고객}} fills a blank.

  2. Paste the table

    Straight from a spreadsheet — the first row is the header. Tab-separated by default; commas with quoted fields also work.

  3. Fix the warnings before you copy

    A placeholder with no matching column is left in the output as-is rather than rendered blank, so nothing goes out with a hole in it. Rows with an empty cell are counted separately.

  4. Copy or download the lot

    Each document has its own copy button, and copy-all joins them with a separator you choose. Fifty are shown; copy and download take all of them.

Common questions

Why can I not write an if statement?

Because a template language with control flow is a programming language, and it has to be documented and sandboxed like one. The default: filter covers the case that actually comes up — a blank cell — without any of that.

One row came out as "안녕하세요 님"

That row has an empty cell where the template expects a value — which is exactly how that greeting goes out to forty people. The warning counts them, and a default: filter fills them.

Does the data leave my browser?

No. A merge table is a list of customers with their amounts, which is exactly the kind of file not to upload. Everything happens in the page.

Feed it from

Next

These accept what this tool produces, so the result can go straight in.