Log daily football results and league standings to Sheets
Every morning, automatically record yesterday's match results and each league's latest table into a spreadsheet you can chart or pivot.
Every morning at 7am, automatically log yesterday's football results and today's league standings from API-Sports into Google Sheets, so I build a season-long record I can chart or pivot. This is a deterministic fetch-and-append logging job: loop over my leagues, fetch, map fields, and append. No summarizing or judgement.
Trigger: run on a cron schedule every day at 7:00am in my timezone. Keep a fixed list of the leagues I track at the top of the workflow so I can edit it. Each league is identified by its API-Sports league ID and the current season, which is a 4-digit starting year (for example season 2025 for the 2025/26 campaign).
Step 1, yesterday's results. For each tracked league, call API-Sports 'List Fixtures (Live, By Date, League, or Team)' filtered by that league ID, the season, and yesterday's date in YYYY-MM-DD format for my timezone. Keep only fixtures whose status is finished (FT, AET, or PEN). For every finished match, append one row to the Results tab of my Google Sheet using Google Sheets 'Append Values', with these columns: match date, league name, home team, away team, final score written as home goals - away goals, and status. If a league returns zero fixtures for yesterday (results is 0), skip it and append nothing for that league.
Step 2, standings snapshot. For each tracked league, call API-Sports 'Get Standings' for the league ID and season. For every team in the returned table, append one row to the Standings tab using Google Sheets 'Append Values', with these columns: today's date as the snapshot date, league name, position or rank, team name, points, goal difference, and recent form. Tagging every row with today's date is what lets me chart a team's position over time; a one-off standings table cannot do that.
Notes: API-Sports is read-only and returns data inside a response array with a results count, so treat results:0 as a valid empty answer, not an error. When appending, use the option that parses input like the Sheets UI (USER_ENTERED) so dates and numbers land as real dates and numbers. Always append after the last row of each tab so the history accumulates and nothing already logged is overwritten.
Additional information
What does this prompt do?
- Each morning, pulls yesterday's finished matches for the leagues you follow and adds a row for every game with the date, both teams, the final score, and the result status.
- Takes a fresh snapshot of each league's table and records every team's position, points, goal difference, and recent form, stamped with the date.
- Builds a season-long history in your own spreadsheet, so you can chart or pivot how a team's position and points change week to week.
- Runs hands-free on a schedule and only adds new rows, so nothing you already logged gets changed or overwritten.
What do I need to use this?
- An API-Sports account (the free plan works for a few leagues checked once a day) to fetch football results and standings.
- A Google account with a spreadsheet that has a results tab and a standings tab.
- The list of leagues you want to follow and the current season year.
How can I customize it?
- Change which leagues and which season year you track.
- Adjust what time it runs each morning and the time zone used to decide what counts as 'yesterday'.
- Rename the results and standings tabs or choose which columns get recorded.
Frequently asked questions
Which leagues can I track?
Do I need a paid API-Sports plan?
Will this overwrite my existing spreadsheet data?
What happens on days with no matches?
Why record the standings every single day?
Related templates
Stop copying football scores into a spreadsheet by hand.
Let this workflow log yesterday's results and today's league tables every morning, so you always have a season-long record ready to chart or pivot.