How to create a staff roster in Google Sheets

Google Sheets is free with a Google account, lives online and opens on any phone, which makes it a natural home for a small team’s roster. Here is a layout that adds up, formulas that fill whole columns at once, checks that catch mistakes, and a way to share the roster without sharing everybody’s pay rate.

The thing that makes Google Sheets good for a roster is also the thing to be careful with: everybody can open the same file. Nobody works from last week’s attachment, and a change shows up on every phone within seconds. But a file the whole team can open is a file the whole team can read, so the layout below keeps the roster people need to see apart from the rates and notes they do not. It follows the same idea as the weekly roster in Excel: one row for every shift, with the totals and the grid built from those rows, so nothing has to be added up by hand.

A hand holding a pen over a monthly calendar on a tablet, beside an open notebook and a cup of coffee
Photo: Pexels
Ask AI about this article
Add as a preferred source on GoogleGoogle shows the sources you choose more often in Top Stories, and can mark them as preferred in AI Mode and AI Overviews.

Before you open a new sheet

Have these ready, because a roster built without them is a roster built twice:

  • The team list, with each person’s role, employment type and agreed hours
  • Availability for the week, and any leave already approved
  • What you expect the week to look like: bookings, deliveries, events and the busy hours of each day
  • The rostering rules in the award or agreement, such as minimum engagement, breaks and the time between shifts
  • A Google account for yourself, and the email address each team member will use to open the roster

Use two files, not one

Most roster sheets start as one file and end up with pay rates, phone numbers and private notes sitting a click away from the whole team. Start with two instead. The manager’s file holds everything. The team’s file holds only the week’s grid, pulled across from the manager’s file by a formula, so it is always up to date and never holds anything it should not.

What goes in each file
File and tabWhat it holdsWho can open it
Manager: TeamOne row per person: name, role, employment type, agreed hours, hourly rate, rostered hoursThe owner and managers
Manager: ShiftsOne row per shift: date, day, name, role, start, finish, unpaid break in minutes, hours, label, costThe owner and managers
Manager: WeekThe grid: names down the side, Monday to Sunday across the topThe owner and managers
Team: RosterA live copy of the Week tab and nothing elseThe whole team, as viewers

In the manager’s file, rename the first tab Team, then add tabs called Shifts and Week with the plus button at the bottom left. On the Shifts tab, put the headings in row 1. The formulas below assume date in column A, day in B, name in C, role in D, start in E, finish in F, unpaid break minutes in G, hours in H, label in I and cost in J. On the Team tab, put name in A, role in B, employment type in C, agreed hours in D, hourly rate in E and rostered hours in F.

Enter times Sheets can add up

Select columns E and F and choose Format, then Number, then Time. Type times with a colon, 6:30 or 18:30, and Sheets stores them as a fraction of a day, which is what lets one be taken from another. A time typed as 6.30 is just a number, and 6.30pm is text, and neither will add up. Format column A as a date, and column G as a plain number of minutes.

Fill whole columns with one formula

In Excel you write a formula in the first row and drag it down. In Google Sheets, ARRAYFORMULA lets one formula in row 2 fill the whole column, including rows you have not added yet. Put this in H2 to work out the paid hours of every shift:

=ARRAYFORMULA(IF(E2:E="","",MOD(F2:F-E2:E,1)*24-G2:G/60))

The IF leaves a row blank until it has a start time. Finish minus start gives the length of the shift as a fraction of a day, and MOD(…,1) fixes the shift that finishes after midnight, where the finish is earlier in the day than the start. Multiplying by 24 turns the fraction into hours, and the break comes off in hours, not minutes. Format column H as a number with two decimal places.

The hours formula checked against three shifts
StartFinishUnpaid breakHours
7:0015:3030 minutes8.00
17:0022:15none5.25
21:301:3015 minutes3.75

Two more fill the day and the label. In B2, =ARRAYFORMULA(IF(A2:A="","",TEXT(A2:A,"ddd"))) turns each date into Mon, Tue and so on, so the day can never disagree with the date. In I2, =ARRAYFORMULA(IF(E2:E="","",TEXT(E2:E,"h:mm")&" to "&TEXT(F2:F,"h:mm"))) builds the label the grid will show. One rule comes with array formulas: type nothing else in those columns below the formula, or Sheets shows an error saying the result would overwrite data.

To estimate the cost of each shift, put =ARRAYFORMULA(IF(C2:C="","",H2:H*VLOOKUP(C2:C,Team!A:E,5,FALSE))) in J2. It looks up each person’s rate on the Team tab. Treat the total as an estimate: most awards pay weekend, evening, public holiday and overtime hours at different rates, and a single rate per person will understate them. The weekend and public holiday hours calculator splits out those hours, and the award pay rates pages show the rates the award sets.

Total each person’s week

On the Team tab, put this in F2 and copy it down for each person, so their rostered hours come straight from the shift rows:

=SUMIFS(Shifts!H:H,Shifts!C:C,A2)

The total changes the moment a shift is added, moved or deleted. If you want to check a week by hand, the work hours calculator does the same sum, and the decimal hours converter turns 5 hours 15 minutes into 5.25.

Build the week grid

On the Week tab, put the names down column A from row 2 and Mon to Sun across row 1 from column B. This formula, in B2 and copied across and down, lists each person’s shifts for the day:

=IFERROR(TEXTJOIN(", ",TRUE,FILTER(Shifts!$I:$I,Shifts!$C:$C=$A2,Shifts!$B:$B=B$1)),"")

FILTER finds the shifts that match the name and the day, TEXTJOIN puts them in one cell, and IFERROR leaves the cell empty on a day off instead of showing an error. Because the grid matches on the day name, keep one file per week: when the week is done, choose File, then Make a copy, name the copy for the next week and change the dates. The formulas come across with it.

Build the checks in

A sheet can warn you before the roster goes out. Use Format, then Conditional formatting, choose Custom formula is, and pick a fill colour you will notice:

  • Too many hours. On the Team tab, apply =F2>D2 to F2:F, so a total above the person’s agreed hours stands out. For a full-time employee, the National Employment Standards set a maximum of 38 hours a week plus reasonable additional hours.
  • Shifts too short. On the Shifts tab, apply =AND(H2<>"",H2<3) to H2:H if the award you checked sets a three hour minimum engagement. Use the figure from your own award.
  • Double booking. Apply =AND($C2<>"",COUNTIFS($C$2:$C,$C2,$A$2:$A,$A2)>1) to C2:C to highlight anyone rostered twice on the same date, then check whether it is a genuine split shift or a mistake.
  • Names that do not match. Select C2:C, choose Data, then Data validation, add a rule and pick Dropdown (from a range) with Team!A2:A, so a shift can only go to somebody on the team list.

Finally, protect the formula columns so nobody types over them by accident: select the column, choose Data, then Protect sheets and ranges, and limit who can edit it.

A worker in an apron showing a phone to two people at a cafe table with a laptop and a cup of coffee
Photo: Pexels

Share the roster without sharing everything

Protecting a range stops people changing it. It does not stop them seeing it, and anyone who can open a file can read every tab in it. That is why the team gets a second file. Create a new spreadsheet called something like Team roster, and in A1 of its first tab enter:

=IMPORTRANGE("paste the manager file’s link here","Week!A1:H40")

The first time, Sheets asks you to allow access between the two files. After that, the team file shows the Week tab and updates when the manager’s file changes, with no rates, phone numbers or notes in it. Then share it:

  • Click Share, add each team member’s email address and set them as Viewer, so they can read the roster but not change it
  • Leave General access as Restricted, rather than Anyone with the link, so a forwarded link does not open the roster to strangers
  • Avoid File, Share, Publish to web for a roster, which puts a copy online for anybody who finds the address
  • In the manager’s file, choose Tools, Notification settings, then Edit notifications to get an email when something changes, and use File, Version history to see who changed what

People open the roster in the Google Sheets app on their phone, which shows the grid well enough for checking a week. For the noticeboard, freeze the top row and the names with View, then Freeze, and print the Roster tab in landscape with the scale set to fit to width. Put the week and the date it was published in the top cell, so an old printout is obvious.

Google Sheets or Excel?

Both will run a small team’s roster well. The difference is mostly in where the file lives and who works on it.

Google Sheets and Excel for a roster
Google SheetsExcel
CostFree with a Google accountPart of Microsoft 365, with a free web version that has fewer features
SharingBuilt in, with everyone on the same fileThrough OneDrive or SharePoint
Formulas for this layoutARRAYFORMULA fills whole columns, and FILTER and TEXTJOIN are standardFill formulas down; FILTER and TEXTJOIN need Microsoft 365 or Excel 2021 onwards
Working without internetOnly if offline access was switched on beforehandThe desktop app works offline
PhonesGoogle Sheets appExcel app

Where a shared sheet starts to strain

A good sheet can run a small team for a long time. The strain shows in the same places for most businesses. Availability and swap requests arrive by message and have to be typed in. Somebody asks why they cannot see the roster because they signed in with a different Google account. Hours actually worked are written somewhere else, and at the end of the week they are retyped into payroll. None of that is a formula problem, which is why a better formula does not fix it.

If that sounds familiar, the guide to moving off a spreadsheet covers the move. Roster Flow keeps what works in this layout, one record per shift and totals that add themselves up, and adds what a shared sheet cannot: availability and leave from staff phones, the roster published to everybody at once, clock ins that become timesheets, and approved hours sent to Xero, MYOB or a CSV file.

A quick checklist

  • Start and finish are formatted as time and typed with a colon
  • Hours use MOD, so shifts past midnight add up
  • Weekly totals come from the shift rows, not typed in
  • Checks flag long weeks, short shifts, double bookings and unknown names
  • Pay rates stay in the manager’s file, and the team sees only the roster
  • The team file is shared with named people as viewers, not with anyone who has the link
  • The printout shows the week and the date it was published

Questions

Can I use an Excel roster template in Google Sheets?

Yes. In Google Sheets, choose File, then Import, and upload the Excel file. Most formulas carry across, but check the totals against a shift or two after importing. The Roster Flow weekly roster template is a free Excel download that imports this way.

Why does a shift past midnight show a negative number of hours?

Because the finish time is earlier in the day than the start, so finish minus start is negative. Wrap the subtraction in MOD, as in =MOD(F2-E2,1)*24, and Sheets counts the finish as the next day.

If I protect the pay rate column, can staff still see it?

Yes. Protecting a range stops people editing it, not viewing it, and anyone who can open the file can read every tab. Keep rates in a file only managers can open, and give the team a separate file that imports the roster.

Does Google Sheets work without an internet connection?

Only if offline access was turned on beforehand, in Google Drive settings on that device. Changes made offline sync when the device reconnects. The Google Sheets app can also make a file available offline.

How do I know when someone changes the roster?

In the file, choose Tools, Notification settings, then Edit notifications, and choose to be emailed when any changes are made. File, Version history shows who changed what and lets you restore an earlier version.

Sources

Back to the blog

Get next week's roster out tonight

Add your venue and your team, build the week, and publish it. Payroll can be connected later.

Start freeQuestions? Contact us
Free for up to 5 staff, permanently. No card to start.