# Build a team directory page from a Google Sheet

People join, leave, and change roles constantly, and a hard-coded team page is out of date the week it ships. Keep names, roles, photos, bios, and departments in a Google Sheet, and PasteSheet serves it as a live JSON API — filter by department and render an always-current directory.

*Last updated: 2026-07-11 · Source: <https://pastesheet.com/use-cases/google-sheets-team-directory>*

## Key facts

- A Google Sheet is capped at **10 million cells** (or 18,278 columns), which is the real ceiling on using one as a database. ([source](https://support.google.com/drive/answer/37603))
- The roster is capped by plan: **500 people on Free**, **5,000 on Starter ($9/mo)**, uncapped on **Pro ($19/mo)**.
- Schema-change alerts and schema lock start on **Starter ($9/mo)**: if HR renames the `department` column, you hear about it before the directory page breaks.
- A cached endpoint reads the sheet **once per TTL**, not once per request — so 10,000 visitors become one upstream read, and Google's quota stops being your problem.

## A team page that stays current

A staff directory is the page most likely to be wrong. Someone joins, someone changes title, someone leaves — and updating a grid of hard-coded cards is a developer chore that slips. HR knows the roster; they just have no way to edit the page.

Give them a Google Sheet instead. One row per person — name, role, department, photo URL, and a short bio — and PasteSheet publishes it as JSON. Your [directory page](https://pastesheet.com/use-cases/google-sheets-directory-website) fetches the rows, filters by department, and renders the cards. HR edits a cell; the page catches up on the next cache refresh, no deploy in the loop.

## What a directory row holds

A single tab with a column per field powers the whole page:

- `name`, `role`, and `department` for the card and filtering.
- `photo` holding a headshot URL your front end renders.
- `bio` for a short blurb and `email` or `links` for contact.
- `order` to control how people rank within a team.

## Filter the directory by department

Pass a department to filter and a column to sort — build a tabbed directory without any query language:

```bash
curl "https://pastesheet.com/your-endpoint/Team?department=Engineering&sort=name"

{
  "data": [
    {
      "name": "Marco Silva",
      "role": "Staff Engineer",
      "department": "Engineering",
      "photo": "https://cdn.example.com/marco.jpg",
      "bio": "Works on the query layer and caching.",
      "email": "marco@example.com"
    }
  ]
}
```

## Read-only, so it is safe to publish

Because the endpoint is **read-only by design**, it is safe to expose publicly or hand to a teammate: consumers can read and query the data but can never change the sheet. And there is **no Google Cloud project, OAuth screen, or service account** to set up — you paste a share URL and get a live API.

## What it costs

**Free — $0/month.** For side projects and trying things out.

- Endpoints: 3
- Requests: 2,000 / month
- Rows per endpoint: 500
- Tabs per endpoint: 1
- Rate limit: 60 / minute

**Start free.** The Free plan runs 3 live endpoints with a 5-minute cache — enough for a team page. Paid plans add a custom cache TTL and [schema alerts](https://pastesheet.com/features) that warn you if someone renames or deletes a column HR relies on.

## Frequently asked questions

### Can HR update the directory without a developer?

Yes. You connect the sheet once; anyone you share it with edits names, roles, and photos in Google Sheets, and the page reflects their changes after the cache refreshes — no code and no deploy.

### How do I split the page by department?

Add a department column and filter the endpoint to department=Engineering, or read every row and group client-side. Sort by name or an order column to control the layout within each team.

### Where do the headshots live?

Store an image URL in a photo cell and return it like any other field. Host the images on a CDN, Drive, or your own bucket, and your front end renders the link.

### What if someone breaks a column?

Paid plans include schema alerts that notify you when a column HR relies on is renamed or removed, so a stray edit does not silently break the directory.

## Sources

- [Files you can store in Google Drive (size limits)](https://support.google.com/drive/answer/37603) — Google

## Related use cases

- [Build a Directory Website From a Sheet](https://pastesheet.com/use-cases/google-sheets-directory-website) — Turn a Google Sheet into a searchable directory. PasteSheet serves your listings as a filterable, read-only JSON API — no database, no admin panel, no code.
- [Drive a Marketing Site from Google Sheets](https://pastesheet.com/use-cases/google-sheets-content-website) — Run your marketing site's content blocks from a Google Sheet — hero copy, feature lists, section text. PasteSheet publishes it as a live, read-only JSON API.
- [Use Google Sheets as a Free Headless CMS](https://pastesheet.com/use-cases/google-sheets-cms) — Run your website's content from a Google Sheet. PasteSheet publishes it as a live, read-only JSON API — no database, no backend, no Google Cloud setup.
- [Build a Testimonials Wall from a Sheet](https://pastesheet.com/use-cases/google-sheets-testimonials) — Run a testimonials or reviews wall from a Google Sheet — names, quotes, ratings, avatars. Feature-flag which ones show over a live, read-only JSON API.

---

[PasteSheet](https://pastesheet.com) turns any Google Sheet into a live REST API and MCP server for AI agents — no backend, no code. Canonical HTML version of this page: <https://pastesheet.com/use-cases/google-sheets-team-directory>
