Spreadsheet as a service

August 2025

As an author of a content management system, sometimes you don’t have the time to wait for a development team to build an API. Even when they set up the API endpoint, every update requires a database change request or some synchronization job to occur.

What if, as an author, you could create your own JSON output without the complexities of building out an API?

To learn by doing, I embarked on a proof of concept: I wanted a page to track my progress through Minnesota’s State Parks. I needed to capture the location, title, and whether or not I had visited each park. So, I quickly coded a little app.

The results ended up here:
https://www.craigantolick.com/mn-state-parks

The Google Sheet manages all the content for the service:

image of Google Spreadsheet populated with map data for a custom app.


Once published, it is cached and performant:
https://www.craigantolick.com/parks.json

AEM Edge Delivery allows you to use multiple sheets with query parameters to pull in specific content. You can access them by appending query parameters such as ?sheet=visited, ?sheet=yet, or ?sheet=visited&sheet=yet.


Google Spreadsheet with arrows to spreadsheet worksheet tabs labeled shared-default and shared-visited

A wonderful feature is the ability to create Google Sheet functions to build out queries, enabling centralized management.

In the image below, I have a QUERY function that filters data from columns A-O in "Sheet" to show only rows where column O equals TRUE. It returns all columns for the matching rows while treating the first row as headers. This setup allows me to reuse content and manage it from one place.

spreadsheet with an arrow to the spreadsheet function and pointing to the reference "Sheet" tab to indicate that we are pulling in data from that sheet.

Since I have the sheet named shared-visited, I can use the query parameter ?sheet=visited to retrieve the relevant content:
https://www.craigantolick.com/parks.json?sheet=visited