Company Team Directory from Google Sheets
Build a searchable team directory by storing employee profiles in Google Sheets and exposing them as a REST API.
A team directory HR can maintain themselves
Internal team directories go stale fast. Someone changes roles, a new hire joins, a photo becomes a dead link — and the website stays wrong for months because updating it requires a developer or a CMS login that nobody remembers. With GKit SheetsAPI, HR owns the data in a Google Sheet they already manage, and the directory page reads live from that Sheet.
Sheet structure
Create a sheet named Team with these columns:
| name | role | department | photo | bio | |
|---|---|---|---|---|---|
| Priya Sharma | Staff Engineer | Engineering | priya@company.com | https://... | Priya leads platform... |
| Marcus Webb | Head of Design | Design | marcus@company.com | https://... | Marcus joined in 2022... |
Keep one row per person. HR updates the Sheet when someone joins, changes roles, or leaves.
The API call
Fetch the Engineering department, only the fields needed for a directory card:
const res = await fetch(
"https://sheetsapi.gkit.mreshank.com/api/spreadsheets/{userKey}/Team" +
"?search=department:Engineering&sort=name&fields=name,role,department,photo"
);
const { data } = await res.json();fields trims the response to only what the UI needs — useful when the Sheet has internal columns (manager, salary band) that shouldn't be public.
Rendering a directory card
data.forEach(person => {
console.log(`${person.name} — ${person.role}`);
// render <img src={person.photo} alt={person.name} />
});Searching across the whole directory
Let visitors search by name or role using a single search parameter:
const query = "design";
const res = await fetch(
`https://sheetsapi.gkit.mreshank.com/api/spreadsheets/{userKey}/Team?search=${query}&fields=name,role,department,photo`
);SheetsAPI searches across all columns by default, so a search for design returns both people in the Design department and anyone with "design" in their role title.
Keeping it current
When a new hire starts, HR adds a row. When someone changes teams, HR edits the department cell. When someone leaves, HR deletes the row (or sets a status column to inactive and filters on ?search=status:active). The directory reflects the change on the next page load — no deploy, no CMS update, no ticket to engineering.
Why this works
HR teams are power users of Google Sheets. Asking them to log into a separate system to maintain headcount data creates friction and leads to drift. Keeping the directory in Sheets and serving it via SheetsAPI means the people closest to the data — HR — are also the ones keeping it accurate. The developer just builds the UI once and points it at the endpoint.
Connect your team Sheet and ship a directory that stays current.