Exchange rates in SheetsDevelopment & Customization

A Google Apps Script that loads the exchange rates you need into your Google Sheet from a source you choose

Usually ready in 15 minutesRevisions includedQuality check
Packages
Payment 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.

A Google Apps Script that loads the exchange rates you need into your Google Sheet from a source you choose

Example result

Example for the Standard package

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 your prices, invoices or reports depend on exchange rates, typing them in every morning is easy to forget. This Google Apps Script reads the rates from a public source you choose, such as the rates your central bank publishes or a rates service where you get your own key, and writes the currencies you need into your Google Sheet with the date. From Standard it keeps a history tab with a row per day, so your formulas can look up the rate for any date; Premium adds a second source if the first does not answer and fills in past dates. Google Sheets has its own GOOGLEFINANCE function for some currencies; this script is for when you need a particular source or a stored history. The rates are the source's; we give no financial advice.

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, allow access and set it to run daily; the code is also shown on the order page.
  • Your sourceThe official or service rates you choose
  • Your currenciesOnly the ones you need, against your base currency
  • A dated historyFrom Standard, a row per day for lookups
  • Key kept out of the codeIf the source needs one, you put it in yourself
  • Readable codeWith comments, easy to add a currency later

How it works

  1. 1
    SourceYou name the currencies and the source you trust
  2. 2
    CodeWe write the script by the source's documentation and the install guide
  3. 3
    Try itYou run it in a copy of the sheet and compare with the source's site
  4. 4
    ChangesYou ask for changes within your package and send any error message

What we need from you

The currencies you need and your base currency, the source you want to use (a link to the page or documentation where it publishes rates, or let us suggest public ones to choose from), how often you need the rates and at what time, and where they should go in your sheet. If you need past dates (Premium), from which date. If the source asks for a key, create it in your account; never send it to us.

We will ask you:

  • Which currencies do you need?
  • Which source should it use?
  • How often and by when?
  • Do you need past dates?

Compare packages

PackagesBasicToday's rates$16StandardRates with history$33PremiumRates tool$67
Deadline1 day2 days3 days
Revisions123
Codeup to 150 linesup to 400 linesup to 1,000 lines
Files of code1up to 3up to 8
Settings fileNoYesYes
Clear error messages and a logNoYesYes
Run options and a guide to running it on a scheduleNoNoYes
Guide to installing and running it (README)YesYesYes
LanguageGoogle Apps ScriptGoogle Apps ScriptGoogle Apps Script
Order BasicOrder StandardOrder 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.
How it works →

Questions and answers

Are the rates accurate?

They are exactly what your chosen source publishes. Official rates are usually set once a working day, and the script cannot be more up to date than its source.

Can it update every minute for trading?

It is meant for daily or hourly rates for prices, invoices and reports, not for trading. We give no financial advice.

What happens on weekends and holidays?

Many official sources publish nothing on those days. From Standard you choose whether the history repeats the last rate or leaves the day empty.

Do you get access to my sheet?

No. You add the script to your own sheet and allow it access yourself. We never log in to your Google account.

Did not find your answer?

Packages