Two weeks of Gmail and Calendar. Your inbox and scheduling are automated. What structured data still lives in a spreadsheet you have to open manually?
After the calendar week, the MRR tracker in Google Sheets is the last manual tab I open every Monday. I check it for new customers and update the KPI dashboard by hand.
GOOGLESHEETS_BATCH_GET reads any range from any spreadsheet. A1 notation — "Sheet1!A1:D10" — is exactly what you'd type in the Sheets formula bar. The response is a list of rows, each a list of cell values:
result = toolset.execute_action(
Action.GOOGLESHEETS_BATCH_GET,
{"spreadsheet_id": sheet_id, "ranges": [range_a1]}
)
rows = result.get("valueRanges", [{}])[0].get("values", [])
for row in rows:
print(row)So a row in Sheets is just a list of strings and numbers? That means any data I have in Python can go into Sheets. That's huge.
That's all it is. Every row you've ever typed manually is just a list Python could have written. And every row Python reads is a list you can process with the Week 1-3 tools. Here's the full function:
def read_range(sheet_id: str, range_a1: str) -> list:
result = toolset.execute_action(
Action.GOOGLESHEETS_BATCH_GET,
{"spreadsheet_id": sheet_id, "ranges": [range_a1]}
)
rows = result.get("valueRanges", [{}])[0].get("values", [])
print(f"Read {len(rows)} rows from {range_a1}")
return rowsSo I read the MRR Sheet, process the rows with the Python-track functions, and pipe the output into an investor email. That's the whole Monday workflow in four function calls.
Your Monday morning spreadsheet tab just became a function argument.
Three apps — Gmail, Calendar, Sheets. Every one follows the same action-then-parse pattern. My brain has the template now.
A1 notation is case-insensitive but the sheet name must match exactly. 'Sheet1!A1:D10' is different from 'sheet1!A1:D10' if your sheet tab is named 'Sheet1'. Check the tab name in your Sheets UI before hardcoding it.
GOOGLESHEETS_BATCH_GET reads rows from a spreadsheet. Once your MRR tracker is in Python, every downstream function — filtering, formatting, emailing — chains directly from this single read call. The entire Monday tab-switching ritual collapses to one Python function call.
toolset.execute_action(
Action.GOOGLESHEETS_BATCH_GET,
{"spreadsheet_id": "1abc...", "ranges": ["Sheet1!A1:D10"]}
){"valueRanges": [{"values": [["date", "plan", "mrr"], ["2026-04-12", "Pro", "149.0"]]}]}"Sheet1!A1:D10" — sheet name, exclamation mark, top-left cell colon bottom-right cell.
Two weeks of Gmail and Calendar. Your inbox and scheduling are automated. What structured data still lives in a spreadsheet you have to open manually?
After the calendar week, the MRR tracker in Google Sheets is the last manual tab I open every Monday. I check it for new customers and update the KPI dashboard by hand.
GOOGLESHEETS_BATCH_GET reads any range from any spreadsheet. A1 notation — "Sheet1!A1:D10" — is exactly what you'd type in the Sheets formula bar. The response is a list of rows, each a list of cell values:
result = toolset.execute_action(
Action.GOOGLESHEETS_BATCH_GET,
{"spreadsheet_id": sheet_id, "ranges": [range_a1]}
)
rows = result.get("valueRanges", [{}])[0].get("values", [])
for row in rows:
print(row)So a row in Sheets is just a list of strings and numbers? That means any data I have in Python can go into Sheets. That's huge.
That's all it is. Every row you've ever typed manually is just a list Python could have written. And every row Python reads is a list you can process with the Week 1-3 tools. Here's the full function:
def read_range(sheet_id: str, range_a1: str) -> list:
result = toolset.execute_action(
Action.GOOGLESHEETS_BATCH_GET,
{"spreadsheet_id": sheet_id, "ranges": [range_a1]}
)
rows = result.get("valueRanges", [{}])[0].get("values", [])
print(f"Read {len(rows)} rows from {range_a1}")
return rowsSo I read the MRR Sheet, process the rows with the Python-track functions, and pipe the output into an investor email. That's the whole Monday workflow in four function calls.
Your Monday morning spreadsheet tab just became a function argument.
Three apps — Gmail, Calendar, Sheets. Every one follows the same action-then-parse pattern. My brain has the template now.
A1 notation is case-insensitive but the sheet name must match exactly. 'Sheet1!A1:D10' is different from 'sheet1!A1:D10' if your sheet tab is named 'Sheet1'. Check the tab name in your Sheets UI before hardcoding it.
GOOGLESHEETS_BATCH_GET reads rows from a spreadsheet. Once your MRR tracker is in Python, every downstream function — filtering, formatting, emailing — chains directly from this single read call. The entire Monday tab-switching ritual collapses to one Python function call.
toolset.execute_action(
Action.GOOGLESHEETS_BATCH_GET,
{"spreadsheet_id": "1abc...", "ranges": ["Sheet1!A1:D10"]}
){"valueRanges": [{"values": [["date", "plan", "mrr"], ["2026-04-12", "Pro", "149.0"]]}]}"Sheet1!A1:D10" — sheet name, exclamation mark, top-left cell colon bottom-right cell.
Create a free account to get started. Paid plans unlock all tracks.