A volunteer roster spreadsheet that catches gaps and double booking
Separate shifts from assignments so a full-looking roster cannot hide an overlapping booking. Count confirmed cover and show which shifts still need review.
In brief
Coverage is provisional when a confirmed volunteer is double-booked. Check both time conflicts and headcount gaps before approving the roster.
A filled shift is not always a covered shift
A volunteer can appear on two shifts at once while both headcounts look fine. This roster shows the bookings behind the counts, flags overlapping confirmed assignments and separates a tentative offer from confirmed cover.
It is a practical social service technology task: a coordinator can build the template, inspect the example and use the same checks before the next programme session. Unlike a list of administrative automation opportunities, this guide supplies the actual inputs, formulas and expected output.
Use an organisation-approved workspace and volunteer codes rather than names or contacts in this starter. Staff approve role suitability, required headcounts and availability before confirming an assignment. The sheet only checks recorded numbers and times; it does not select suitable people, contact volunteers or send messages.
Create three tabs with separate jobs
Name the tabs exactly Shifts, Assignments and Summary. In Shifts, A:E are ShiftID, Start, End, Role and Required. Add Confirmed, Gap and Check in F:H. Each ShiftID must be unique; create a separate shift for each role and time slot.
In Assignments, A:C are ShiftID, VolunteerID and Status. Add Start, End, Conflict and Duplicate in D:G. Each row is one volunteer assigned to one shift. Use Confirmed only after a coordinator has checked availability and approved the role; use Pending for a proposed assignment and Cancelled for a withdrawn one. Cancelled rows remain visible but do not contribute cover.
Synthetic demonstration follows: every shift, role label and volunteer code below is invented, not real agency or personal data, a model output or an observed result. Welcome desk and Activity support are example staff-approved roles for this scenario, not recommendations about any volunteer's suitability.
Complete shifts input: Shifts!A1
ShiftID,Start,End,Role,Required
S01,2026-10-19 09:00,2026-10-19 11:00,Welcome desk,2
S02,2026-10-19 10:00,2026-10-19 12:00,Activity support,2
S03,2026-10-19 11:00,2026-10-19 13:00,Welcome desk,1
S04,2026-10-20 09:00,2026-10-20 11:00,Activity support,1Complete assignments input: Assignments!A1
ShiftID,VolunteerID,Status
S01,V001,Confirmed
S01,V002,Confirmed
S02,V001,Confirmed
S02,V003,Pending
S03,V002,Confirmed
S04,V004,Cancelled
S04,V005,PendingLoad the inputs and check the time cells
Import each CSV into its named tab starting at A1. If pasted text stays in one column, split it using commas. Format Shifts!B2:C5 as date and time. Do not type just a clock time: storing the date prevents a booking tomorrow being compared as if it were today.
Test =ISNUMBER(Shifts!B2) and =ISNUMBER(Shifts!C2) in unused cells. Both must be TRUE. If dates imported as text, replace B2 with =DATE(2026,10,19)+TIME(9,0,0) and C2 with =DATE(2026,10,19)+TIME(11,0,0) to establish the intended format, then correct the other rows. Every End must be later than its Start. Split an overnight booking into dated intervals rather than using an end time earlier than the start.
Select Assignments!A2:A1000 and use Data → Data validation → Add rule → Dropdown from a range, with Shifts!A2:A5 as the source.[3] Extend that source when adding shifts. For C2:C1000, create a single-selection Dropdown containing Confirmed, Pending and Cancelled, with invalid values rejected.[3] Never use a multi-select status.
Bring shift times into each assignment
Enter the following formulas in Assignments!D2 and E2, then fill both down to row 1000. They use the ShiftID to fetch the times. VLOOKUP searches the first column of a range; FALSE requests an exact match rather than an approximate match.[2] A missing shift therefore produces a visible error instead of silently borrowing another shift's time.
Keep these columns as formulas. Changing a shift's time should change every linked assignment, not leave several manually typed versions of the same booking. Before approving a roster, check for blank volunteer codes, invalid times, unknown shifts and formula errors.
Assignments!D2
=IF(A2="","",VLOOKUP(A2,Shifts!$A$2:$E$1000,2,FALSE))Assignments!E2
=IF(A2="","",VLOOKUP(A2,Shifts!$A$2:$E$1000,3,FALSE))Flag overlaps and duplicate assignments
Put the next formulas in F2 and G2 and fill them down to row 1000. COUNTIFS counts rows matching multiple criteria.[1] The overlap check compares confirmed assignments for the same volunteer. Two intervals overlap when the other start is earlier than this end and the other end is later than this start.
The current row meets those conditions itself, so the test looks for more than one match. CHAR(60) supplies the less-than sign in the start-time criterion. Strict comparisons mean a shift ending at 11:00 does not conflict with one starting at 11:00. Travel or handover time is not included: if a buffer is required, staff must put it into the recorded interval or check it separately.
The duplicate check catches the same volunteer confirmed twice on one ShiftID. It flags both copies, because retaining either copy is a source-record decision. Pending and Cancelled bookings do not trigger these confirmed-booking checks.
Assignments!F2
=IF(OR(A2="",B2=""),"",IF(NOT(C2="Confirmed"),"",IF(COUNTIFS($B$2:$B$1000,B2,$C$2:$C$1000,"Confirmed",$D$2:$D$1000,CHAR(60)&E2,$E$2:$E$1000,">"&D2)>1,"CONFLICT","OK")))Assignments!G2
=IF(OR(A2="",B2=""),"",IF(NOT(C2="Confirmed"),"",IF(COUNTIFS($A$2:$A$1000,A2,$B$2:$B$1000,B2,$C$2:$C$1000,"Confirmed")>1,"DUPLICATE","OK")))Calculate provisional coverage and the review queue
Enter the next formulas in Shifts!F2:H2 and fill them down through row 1000. Confirmed counts assignment rows, Gap is the shortfall against Required, and Check is the action label. A conflict or duplicate takes priority over a reassuring headcount and produces Review.
Review does not mean the gap has been solved. The headcount still includes that problematic booking, so both Confirmed and Gap are provisional until staff correct it. Without a conflict or duplicate, the labels are Gap, Over or Covered. Over means confirmed assignments exceed the agreed requirement; it asks the coordinator to inspect the plan, not dismiss someone automatically.
Shifts!F2
=IF(A2="","",COUNTIFS(Assignments!$A$2:$A$1000,A2,Assignments!$C$2:$C$1000,"Confirmed"))Shifts!G2
=IF(A2="","",MAX(0,E2-F2))Shifts!H2
=IF(A2="","",IF(COUNTIFS(Assignments!$A$2:$A$1000,A2,Assignments!$F$2:$F$1000,"CONFLICT")+COUNTIFS(Assignments!$A$2:$A$1000,A2,Assignments!$G$2:$G$1000,"DUPLICATE")>0,"Review",IF(G2>0,"Gap",IF(F2>E2,"Over","Covered"))))Check every row against the worked result
The supplied inputs produce the following complete shift summary. S01 and S02 need review because V001 appears in overlapping confirmed intervals. S03 is clean: V002 finishes S01 exactly when S03 starts. S04 has no confirmed cover because its two entries are Cancelled and Pending.
These expected values were independently calculated from the CSVs, and the common formulas were executed in LibreOffice. They have not been exercised in a signed-in Google Sheets session; compare your pasted results with this sample before using the file for operational scheduling.
Expected Shifts!A2:H5 coverage fields
| ShiftID | Role | Required | Confirmed | Gap | Check |
|---|---|---|---|---|---|
| S01 | Welcome desk | 2 | 2 | 0 | Review |
| S02 | Activity support | 2 | 1 | 1 | Review |
| S03 | Welcome desk | 1 | 1 | 0 | Covered |
| S04 | Activity support | 1 | 0 | 1 | Gap |
Expected Assignments!D2:G8, in input order
| ShiftID | VolunteerID | Start | End | Conflict | Duplicate |
|---|---|---|---|---|---|
| S01 | V001 | 2026-10-19 09:00 | 2026-10-19 11:00 | CONFLICT | OK |
| S01 | V002 | 2026-10-19 09:00 | 2026-10-19 11:00 | OK | OK |
| S02 | V001 | 2026-10-19 10:00 | 2026-10-19 12:00 | CONFLICT | OK |
| S02 | V003 | 2026-10-19 10:00 | 2026-10-19 12:00 | ||
| S03 | V002 | 2026-10-19 11:00 | 2026-10-19 13:00 | OK | OK |
| S04 | V004 | 2026-10-20 09:00 | 2026-10-20 11:00 | ||
| S04 | V005 | 2026-10-20 09:00 | 2026-10-20 11:00 |
Add a compact roster-wide summary
In Summary, put Metric and Value in A1:B1. Type the metric labels from the table below into A2:A9, then enter the matching formulas in B2:B9. Required and Confirmed are shift-assignment slots, not distinct volunteers. Conflict rows count both sides of an overlap, not the number of people involved.
Summary!B2:B9 formulas with destinations
Summary!B2
=COUNTA(Shifts!A2:A1000)
Summary!B3
=SUM(Shifts!E2:E1000)
Summary!B4
=SUM(Shifts!F2:F1000)
Summary!B5
=SUM(Shifts!G2:G1000)
Summary!B6
=COUNTIF(Assignments!F2:F1000,"CONFLICT")
Summary!B7
=COUNTIF(Assignments!G2:G1000,"DUPLICATE")
Summary!B8
=COUNTIF(Shifts!H2:H1000,"Review")
Summary!B9
=COUNTIF(Assignments!C2:C1000,"Pending")Expected Summary!A2:B9
| Metric | Value |
|---|---|
| Shifts | 4 |
| Required slots | 6 |
| Confirmed slots | 4 |
| Gap slots | 2 |
| Conflict rows | 2 |
| Duplicate rows | 0 |
| Shifts needing review | 2 |
| Pending assignments | 2 |
Use it before confirming the next roster
Each day, enter proposed assignments as Pending, check availability through your normal coordination process and only then mark approved bookings Confirmed. Look first at errors and Review, then Gap and Over. Do not approve the whole roster simply because the sum of Confirmed looks large enough.
For visible flags, select Assignments!A2:G1000, choose Format → Conditional formatting → Custom formula is and use =OR($F2="CONFLICT",$G2="DUPLICATE").[4] On Shifts!A2:H1000, use =OR($H2="Review",$H2="Gap",$H2="Over"). These rules read their own tab's results; the text labels still carry the meaning when colour is unavailable.
To repair the sample, replace V001 on S02 with another staff-approved, available volunteer code such as synthetic V006, then confirm V003 for S02 and V005 for S04 after approval. The repaired example should show every shift Covered, zero gap slots and zero conflict rows. This is a test edit, not an automatic allocation rule.
Troubleshooting and common questions
Why is a full shift marked Review? A confirmed booking has a conflict or duplicate. Fix the assignment, not the label. Copying a confirmed assignment into another row should flag DUPLICATE and CONFLICT on both copies; delete the test afterward.
Why do lookup cells show an error? Check the ShiftID exists once in Shifts. Do not hide the error with a blank fallback. A missing time makes overlap checks unreliable.
Why did a new row not count? These ranges stop at row 1000. Extend all formulas, dropdown rules and formatting together before exceeding that limit. If formulas fail to parse, check straight quotation marks and your locale's formula separator; these examples use commas.
Can we store personal contacts or message people? Neither is needed here. Use the approved volunteer register and communication process separately. This workbook has no messaging step.
Does Covered mean ready to run? It means the recorded confirmed headcount meets Required without these detected conflicts. Staff must still check role approval, valid times, travel needs and whether the volunteers have agreed to attend.
Sources
Test one roster before adding automation
Use synthetic shifts in a practical Social Tech Guild session to work through coverage, overlap checks and the coordinator handoff.
Explore volunteer AI supportCould a small tool make your team’s work lighter?
Tell me about a task that keeps taking time. We can look at it together and see whether a small volunteer project could help.
Please do not include client-identifying information.