The simplest way to manage Google Sheets employee shift schedules is one row per shift, a few formulas that total hours and flag double bookings, and a second tab that lists only the shifts you still need to tell people about. That setup takes about an hour to build, and it fixes the usual weakness of a spreadsheet roster: nobody is told when it changes. Free guides to
building a schedule in Google Sheets list the same gaps: no reminders when a schedule is published, no detection of double-booked staff, and shift swaps handled in scattered messages.This guide builds the roster, adds the checks, and then sends each person their own shift by text with the Sheet Gurus SMS sidebar. It also says plainly which parts are still manual.
A usable roster needs one row for each shift and one column for each fact you will want to filter, total or text later. A weekly grid (names down the side, days across the top) is easy to read but hard to send from, because one cell holds one person’s whole day. The row-per-shift layout reads less nicely and works much better, and you can still build a grid view from it later.
The worked example in this guide is a café with two locations and 12 staff, about 30 shifts a week. The manager builds the schedule on Thursday, and everyone should hear about their shifts on Friday. Your numbers will differ, but the layout holds for a cleaning crew, a clinic front desk or a warehouse.
Create a tab named Roster and type these headers in row 1, spelled exactly as shown, because the text step later reads them.
| Column | Header | What goes in it |
|---|---|---|
| A | FirstName | The employee’s first name |
| B | Phone | Mobile number, same format on every row |
| C | ShiftDate | A real date, formatted as “ddd, mmm d” (Mon, Nov 2) |
| D | Start | A real time, formatted as “h:mm AM/PM” |
| E | End | A real time, same format |
| F | Location | Where to report |
| G | Role | Opener, barista, cashier |
| H | Hours | A formula, covered next |
| I | Check | A formula, covered next |
| J | Status | Pending, Sent or Off |
Use real dates and times, not typed text. Date and time cells are what let the formulas below do arithmetic. Add dropdowns from Data, then Data validation, on Location, Role and Status so that “Main St” is never also “Main Street” in another row. On larger teams, keep staff details on a separate tab and have the dropdowns read from it.
Two formulas do most of the useful work: one that totals the hours on each row and one that flags a person booked twice at the same time.
In H2, enter this and fill it down:
=IF(D2="","",MOD(E2-D2,1)*24)
The MOD part keeps overnight shifts right. A 10 PM to 6 AM shift returns 8, not a negative number. Weekly totals per person then come from a SUMIF over the Phone column, on a summary tab or at the bottom of the roster.
In I2, enter this and fill it down:
=IF(A2="","",IF(SUMPRODUCT(($B$2:$B$500=B2)*($C$2:$C$500=C2)*($D$2:$D$500<E2)*($E$2:$E$500>D2))>1,"Overlap",""))
It counts rows with the same phone number on the same date whose time window crosses this one, and the row always counts itself once, so anything above 1 is a clash. Back-to-back shifts such as 6 AM to 2 PM and 2 PM to 10 PM are not flagged. The check compares times within one calendar day, so it does not catch an overnight shift that runs into the next morning. Add a conditional formatting rule (Format, then Conditional formatting) that turns the row red when column I says Overlap, and stretch the 500 if your roster grows past it.
Phone is the better key than name here, since two employees can share a first name.
Treat Status as the single source of truth for who has been told what. Every new row starts as Pending, and a row only becomes Sent after you have texted it. When a shift moves, edit the date, time or location in the same row and set Status back to Pending, so the change goes out on the next send and nothing else does.
Sick calls and swaps then take thirty seconds: change the name and phone on the row, or add a new row for the cover, and mark it Pending. If someone is dropping a shift entirely, mark the row Off so it never appears in a send. Because every row carries a date, you can sort or filter the roster by person to answer the question employees ask most, which is “what am I working next week?”
Sheet Gurus SMS sends to the rows of the tab you have open, so the send tab should contain only the rows you want to text. Add a tab named ToSend, type the same ten headers in row 1, and put this in A2:
=FILTER(Roster!A2:J, Roster!J2:J="Pending")
To text only some rows, put just those rows on their own tab, here with a FILTER formula, and send from that tab. The headers must sit above the formula, because variables read the column headings in the first row of the tab you send from. The formula fills the rows underneath.
Two details trip people up. A variable inserts what the cell shows, but a FILTER result does not inherit the formatting of the source cells, so set column C on ToSend to “ddd, mmm d” and columns D and E to “h:mm AM/PM”, or the text will show a raw number or the wrong date format instead of “Mon, Nov 2”. And when nothing is Pending, the formula shows an error, which just means there is nothing left to send.
Open the ToSend tab, open the Sheet Gurus SMS sidebar in Google Sheets, and write one message that uses your column headers as variables. You write and send the messages from the sidebar, not from spreadsheet formulas or code. The number you send from is a toll-free number by default (US and Canada only), with custom local area codes available on Pro.
A message that works for the roster above:
Hi {FirstName}, your shift: {ShiftDate}, {Start} to {End} at {Location} ({Role}). Reply Y to confirm.
For Dana on a Monday opening shift, the sidebar’s preview shows “Hi Dana, your shift: Mon, Nov 2, 6:00 AM to 2:00 PM at Main St (Opener). Reply Y to confirm.” Read through the preview of a few recipients before you send, since it shows each person’s message with their own values filled in. That message is about 100 characters, well inside the 160 characters of a single SMS segment, but a long location name can push it over, so check the longest row.
Two limits shape how you write it. An empty cell leaves its variable blank (there are no fallback values), so a missing Location produces “at (Opener)“. Fill every column the message uses. And the add-on does not save message templates, so keep your wording in a cell or on a notes tab and paste it in each week.
Replies appear in the two-way inbox in the sidebar, linked to the recipient’s row in the sheet, but the roster cells do not change. You can tag them, filter by unread, search by phone number and assign conversations to a team member, and each message also gets a delivery status, so you can see which texts failed and fix the number. When someone replies Y, record the confirmation in the sheet yourself.
After each send, set the Status of the Roster rows that were sent to Sent. Do it on Roster, not on ToSend, because ToSend is a formula result you cannot edit. Once those rows are marked Sent they drop off ToSend, so a later send does not text them again. For a scheduled send, mark the batch Sent as soon as you schedule it, because the schedule has already read the tab. If you edit a row after that, set it back to Pending.
Yes, on the Growth and Pro plans you can schedule a send for a future time from the sidebar, with one limit: it is one time for the whole batch, and it does not repeat. A Thursday evening schedule for Friday 9 AM works, and next week you schedule again.
Because a scheduled send reads the tab when you schedule it, rows added or changed afterwards are not part of that batch. Finish the roster, check that column I is clear, and only then schedule. If you need to change a message or the time, you can edit or cancel a scheduled send before it goes out. Late changes go out as a small second send of whatever is Pending then: set each row you edited after scheduling back to Pending, so the second send picks it up, and mark those rows Sent once that second send is sent or scheduled.
The roster stays live: the ToSend tab recalculates as you edit Status, and the preview always reflects the current cells. The send itself is always started or scheduled by a person. There are no triggers yet, so nothing texts automatically when a row is added or a cell changes. Triggers are on the product roadmap with no announced date.
Text cost is the plan fee plus a per-segment charge, and it is small for one-shift-one-text rosters until the volume gets large. The table assumes four weeks a month, one text per shift, one segment per text, a one-segment reply to every text, and a single user who sends. Replies are billed at the plan’s per-segment rate on Starter and Growth and are free on Pro. Sheet Gurus SMS prices as of October 2026. Plan fees are billed monthly, while usage is charged at the end of the billing period or when a usage threshold is reached.
| Shifts per week | Starter ($9, $0.04 per segment) | Growth ($49, $0.03) | Pro ($99, $0.02) |
|---|---|---|---|
| 30 (the café) | $18.60 | $56.20 | $101.40 |
| 150 (five locations) | $57.00 | $85.00 | $111.00 |
| 600 (a large operation) | $201.00 | $193.00 | $147.00 |
Starter is cheapest for the café, but it has no scheduled sends, so you would send by hand on Friday morning. Growth adds scheduling, and Pro is cheapest only at the highest volume, where free inbound replies outweigh the higher monthly fee. Extra users cost $9 a month on Starter and $5 on Growth, while Pro has unlimited seats, so a team of managers sharing the roster changes the arithmetic. The plans and scheduling article lists what each tier includes, and the 30-day free trial comes with 50 credits, enough to send a real week to a few people before you commit.
Four things stay manual, and it is better to plan for them than to find them on a busy week. Nothing sends when a row changes, so you start each send. A schedule does not repeat, so you schedule every week. Each row is a separate text, so an employee with five shifts gets five messages. To text each person once, build a tab with the headers FirstName, Phone and Shifts in row 1, list each employee’s name and phone beneath, and join their shifts into one cell with TEXTJOIN. Date and time cells must be wrapped in TEXT, because TEXTJOIN on the raw cells returns serial numbers. The FILTER also keeps only this person’s shifts that are not marked Off and that fall in the next seven days, so past weeks and cancelled rows stay out. In C2, with the phone number in B2:
=IFERROR(TEXTJOIN(" / ",TRUE,ARRAYFORMULA(FILTER(TEXT(Roster!C2:C,"ddd, mmm d")&" "&TEXT(Roster!D2:D,"h:mm AM/PM"),Roster!B2:B=B2,Roster!J2:J<>"Off",Roster!C2:C>=TODAY(),Roster!C2:C<TODAY()+7))),"")
The seven days run from the day you open the sheet, so build this tab on the day you send. For a single row the same wrapping looks like TEXT(C2,“ddd, mmm d”) and TEXT(D2,“h:mm AM/PM”). A full week rarely fits in 160 characters, so budget for several segments per text.
If you are texting staff for the first time, get their agreement to be messaged at the number you hold, and keep the message to schedule matters. The mass text employees article covers the practical side, and getting started with Sheet Gurus SMS walks through installing the add-on. For route-based teams, the driver scheduling example adapts this layout to assignments, and the guide on personalizing texts with variables goes deeper on the curly-brace syntax. If you would rather start from a ready-made grid, the Spreadsheetpoint shift template has dropdown shift codes and a coverage summary, though it does not notify staff either.
Yes for building the roster, totalling hours and flagging overlaps, but not for telling staff. A sheet has no way to message people, so you pair it with a send step such as the Sheet Gurus SMS sidebar.
Use formulas for hours and conflicts, a FILTER tab for what is still unsent, and a scheduled send for the weekly message. Triggers that fire when a row changes are not available yet, so the send is always started or scheduled by you.
Only if you share the sheet with them. A text reflects the cells at the moment you send or schedule it, so a change made afterwards needs a new send.
No. Sheet Gurus SMS supports only the US and Canada.
