DevelopmentPayment protectionDetails
- Revisions within the package are free.
- If you do not respond within 3 days of delivery, the work is accepted automatically.
The money is reserved when you pay and released only once you accept the work.

Example result
Merging the monthly sales files of 9 shops into one Excel report
How it is run
python merge_sales.py --month 2026-10
2026-11-02 09:14:03 INFO Folder: sales/2026-10, 9 files found
2026-11-02 09:14:03 INFO shop-01.csv: 1,284 rows
2026-11-02 09:14:04 INFO shop-02.xlsx: 967 rows
2026-11-02 09:14:04 WARN shop-07.csv: 3 rows without a price skipped (lines 88, 412, 913)
2026-11-02 09:14:05 INFO Done: 10,412 rows -> report-2026-10.xlsx (sheets "Sales" and "Totals")
Settings, not code
The column names of each shop live in settings.ini, so a new shop or a renamed column is a line there:
[columns]
date = Date, Sale date, Day
product = Product, Item, Name
quantity = Qty, Quantity, Pcs
price = Price, Unit price
A part of the code
def read_shop_file(path: Path, columns: dict[str, list[str]]) -> pd.DataFrame:
"""Reads one shop's file and gives it the report's column names."""
table = pd.read_excel(path) if path.suffix == ".xlsx" else pd.read_csv(path, encoding="utf-8-sig")
renamed = {}
for name, variants in columns.items():
found = next((c for c in table.columns if c.strip() in variants), None)
if found is None:
raise ReportError(f"{path.name}: no column for '{name}' (looked for {', '.join(variants)})")
renamed[found] = name
table = table.rename(columns=renamed)[list(columns)]
table["shop"] = path.stem
return table
Files: a ZIP archive with merge_sales.py (310 lines), settings.ini, requirements.txt and a README with installing Python, running the script and what each message in the log means. The client runs it on their own computer.
Client: a small chain of 9 stationery shops; each shop sends its sales for the month as a CSV or Excel file, with slightly different column names. Task: one script that reads every file in a folder, brings the columns to one shape, and writes a single Excel report with all sales and a sheet of totals by shop.
The client and all details are made up.
About this service
If you keep orders or work hours in a Google Sheet, making each invoice by hand means copying the client, items and totals into a document and saving a PDF. This Google Apps Script adds a button to your sheet: it fills your own invoice template in Google Docs or Sheets with the row's data, saves a PDF named the way you want into a Drive folder and puts the link back into the row. From Standard it handles several item lines and numbering; Premium can email each PDF from your Gmail to your client. Totals, taxes and wording come from your sheet and template: the script does the sums you describe and gives no tax or accounting advice, so check the first invoices. You install and run it in your Google account.
What is included
- What you getA ZIP archive with the Apps Script code and a README that shows how to add it to your sheet and template; the code is also shown on the order page.
- Your own templateYour layout, logo and wording in Google Docs or Sheets
- PDF to DriveNamed by number, client and date, in the folder you set
- Link in the rowYou see which rows already have an invoice
- NumberingFrom Standard, the next number taken from your sheet
- Readable codeWith comments, easy to change a field later
How it works
- 1TemplateYou send the sheet's columns and your invoice template
- 2CodeWe write the script and the guide to installing it
- 3Try itYou make test invoices in a copy of the sheet and check the sums
- 4ChangesYou ask for changes within your package and send any error message
What we need from you
The column names of your sheet with two or three rows of made-up data, your invoice template (a Google Doc or Sheet, or a PDF of an invoice you send now) with the places each value goes, and how totals are counted: tax rate, discounts, currency and rounding, as your accountant tells you. How invoices are numbered and named, the Drive folder for the PDFs, and, for Premium, the email text to the client.
We will ask you:
- What do you invoice for?
- What are the sheet's columns?
- What does your invoice look like?
- How are totals counted?
Compare packages
| Packages | BasicOne invoice at a time$16 | StandardInvoices with settings$33 | PremiumInvoicing tool$67 |
|---|---|---|---|
| Deadline | 1 day | 2 days | 3 days |
| Revisions | 1 | 2 | 3 |
| Code | up to 150 lines | up to 400 lines | up to 1,000 lines |
| Files of code | 1 | up to 3 | up to 8 |
| Settings file | No | Yes | Yes |
| Clear error messages and a log | No | Yes | Yes |
| Run options and a guide to running it on a schedule | No | No | Yes |
| Guide to installing and running it (README) | Yes | Yes | Yes |
| Language | Google Apps Script | Google Apps Script | Google Apps Script |
| Order Basic | Order Standard | Order Premium |
Payment protection
You pay when you order, but the money is released only for accepted work.
- Fixed priceThe package price does not change after you pay.
- The money is reservedWhen you pay, the amount is only reserved. It is released to the service once you accept the work.
- Checked before deliveryEvery result goes through a quality check before it reaches you, and you see it on the order page before accepting it.
- Free revisionsAsk for changes within your brief as many times as the package allows.
- Acceptance after 3 daysIf within 3 days of delivery you neither accept the work nor ask for changes, it is accepted automatically. If you write in the order chat after delivery, the order waits; once we answer, we may start the 3 days again and will say so in the chat.
- Redo or a full refundIf the result does not match your brief and the revisions did not fix it, or the work takes more than twice its deadline, write in the order chat: we will redo the work or refund the payment in full.
Questions and answers
Will the invoices be legally correct?
The script fills in what your template and sheet hold and counts the way you describe. What an invoice must contain in your country is for you or your accountant to decide; we do not give tax or legal advice.
Can it email the invoices?
In Premium, yes: from your own Gmail to the address in the row, within the daily sending limit Google sets for your account. You can turn sending off and only save PDFs.
Can it take payments or link to my accounting program?
No, it makes PDFs. A payment link you already have can be printed on the invoice as text from your sheet.
Do you get access to my Drive?
No. You add the code to your own sheet and allow it access yourself. We never log in to your Google account.
Did not find your answer?


