A Google Sheets kanban template is one table with a Status column, where a task moves by changing a cell rather than dragging a card. Sheets can also do two things Excel cannot as cleanly: show a single stage on its own with a FILTER formula that updates live, and add a menu button that moves the selected task forward with one click, using Apps Script. This post gives you both, plus a COUNTIFS formula that flags a stage the moment it goes over its limit, and the point where the sheet stops being enough.
Why the downloadable templates fall short
Search for a Google Sheets kanban template and you mostly find one of two things. The first is a gallery of free downloads: five coloured blocks across a sheet, each holding cards you drag by cutting and pasting a range of cells. None of the ones we checked count how many tasks are in a stage, filter down to one stage, or flag when you have taken on too much. They are a picture of a board, saved as a spreadsheet.
The second is a paid add-on installed from the Google Workspace Marketplace, which gets you a real drag-and-drop board but also a second tool to manage, a login for anyone you share the sheet with, and a subscription once the trial ends.
Neither gets you a working single-table board with its own WIP count, which is the one thing a spreadsheet is actually good at. Building it yourself takes about fifteen minutes.
What columns should the board have?
Five stages, each with a rule for when a task is allowed to leave it:
| Stage | What sits here | A task leaves when |
|---|---|---|
| Backlog | Everything agreed but not scheduled | You decide to work on it this week |
| To Do | This week's work, already prioritised | You actually start it |
| In Progress | Open right now | The work itself is finished |
| Review | Waiting on a check, a reply or an approval | The check comes back |
| Done | Finished this week | The week ends and you archive it |
Splitting Review from In Progress is the part worth keeping even if you drop everything else. Work stuck waiting on someone else looks identical to work you are actively doing once it is one column wide, and merging the two hides the actual reason a week stalled. For the reasoning behind the stages themselves, what kanban actually is covers the method.
How do you build the sheet?
1. One table, not five blocks. In row 1, add headers:Title, Status, Owner, Due, Notes. Select the range and go to Format > Alternating colors to turn it into a proper table, or just keep it as a plain range with a header row. Sheets does not require the equivalent of Excel's named tables for the formulas below to work.
2. Turn Status into a dropdown. Select the Status column, open Data > Data validation, choose "Dropdown" as the criteria, and list the five stage names. A task moves by picking a new value, and nobody can create a sixth stage by typo.
3. Count each stage. In a small block to the side, list the five names and next to the first one write:
=COUNTIF(B2:B200, H2)
B2:B200 is the Status column, H2 is the stage name in that row. Fill down for the rest. Unlike a named table, a plain range needs enough rows padded in advance, so size B2:B200 for however many tasks you expect to hold.
4. Flag a stage that is over its limit. Put your WIP limit next to the In Progress count, say count in I3 and limit in J3. Select I3, open Format > Conditional formatting, choose "Custom formula is", and enter:
=$I$3>$J$3
Set the fill to red. COUNTIFS does the same job as COUNTIF if you ever need a second condition, such as counting only tasks owned by one person.
=FILTER(Board!A2:E200, Board!B2:B200="In Progress")
That pulls every row where Status equals "In Progress" and updates the moment a cell changes, with no manual re-filtering. Google documents the full syntax on its FILTER function reference. Duplicate the sheet five times, once per stage, and you have five live views instead of one table you keep re-filtering by hand.
A one-click "move forward" button
Cutting and pasting a row between blocks is the actual reason spreadsheet boards get abandoned. Apps Script fixes the worst of it with a menu item that advances the selected task's Status by one stage. Open Extensions > Apps Script and paste:
const STAGES = ['Backlog', 'To Do', 'In Progress', 'Review', 'Done'];
function moveForward() {
const sheet = SpreadsheetApp.getActiveSheet();
const cell = sheet.getActiveCell();
const row = cell.getRow();
const statusCell = sheet.getRange(row, 2);
const i = STAGES.indexOf(statusCell.getValue());
if (i > -1 && i < STAGES.length - 1) statusCell.setValue(STAGES[i + 1]);
}
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Board')
.addItem('Move task forward', 'moveForward')
.addToUi();
}
Save, reload the sheet, click any row in your table, then Board > Move task forward. onOpen and createMenu are the two calls Google's own custom menu guide builds this pattern around. It is not a drag, but it is one click instead of a cut and a paste.
What should your WIP limit be?
Start at two per person for In Progress and leave Review uncapped for the first couple of weeks. Two is low enough that hitting the limit actually changes what you do next: you finish something before starting another thing, instead of the count becoming background noise. WIP limits explained covers how to raise the number once you have real data on where work backs up.
Watch Review, not In Progress, if the count keeps climbing. A rising Review count with a flat In Progress count means the bottleneck is someone else's queue, not your capacity, and no formula fixes that.
When does the sheet stop being enough?
Later than Excel, because Sheets already solves the one thing that breaks a shared spreadsheet fastest: two people editing at once without a lock file or a "read-only, someone else has it open" message. That buys real time.
What it never solves is drag itself. Moving a task is still a dropdown pick or a menu click, never a card you pick up and drop. There is no per-task history, so nobody can say when a task actually entered Review or how long it sat there. Attachments mean a Drive link pasted into a Notes cell rather than a file next to the task, and nobody gets notified when a teammate changes a row, so the person waiting on a review still has to remember to check.
For one person tracking under a hundred tasks, that is all fine and the sheet is the right tool. Once a second or third person needs to know the moment something moves, kanban vs Trello is worth reading before you build a bigger version of the same spreadsheet.
Frequently asked questions
Is there a free kanban template for Google Sheets?
The downloadable ones are free but static: no WIP count, no live single-stage view, no move-forward shortcut. Building the version in this post takes about fifteen minutes and gets you a COUNTIF-based limit, a FILTER-based board view per stage, and an Apps Script menu button, none of which the downloads include.
Can Google Sheets enforce a WIP limit?
Not enforce, but flag reliably. A COUNTIF or COUNTIFS over the Status column gives a live count per stage, and a custom-formula conditional formatting rule turns the cell red once that count passes a limit you set. Sheets will not stop you adding a sixth task. It will make the sixth one obvious the moment you look.
Does this work the same way in Excel?
Almost exactly. Kanban board template in Excel uses the same one-table layout and the same COUNTIF formula; only the menu paths differ (Data > Data Validation instead of Data validation, Conditional Formatting > New Rule instead of Format > Conditional formatting). Sheets is the better starting point once more than one person edits.
Why can't I drag cards like a real kanban board?
Because a spreadsheet cell has no concept of a draggable object, only a value. Filter views, FILTER formulas and an Apps Script menu all get you closer, but every one of them is still a value change under the hood. If the drag itself is the point, that is the actual signal to move to a tool built for it rather than adding another script to the sheet.
Can I move a Google Sheets kanban board into a kanban app later?
Yes. Download the sheet as CSV (File > Download > Comma-separated values) and keep the Title, Status, Owner, Due and Notes headers, since those are the names an importer recognises without manual mapping. A board built from five separate blocks instead of one table cannot be imported cleanly, which is the other reason to build it as a table from the start.
Start simpler than the sheet
The table above is worth building if a spreadsheet is genuinely where the work already lives. If you are starting from nothing, open a board without signing up and see whether real drag-and-drop, per-task history and notifications are worth the five minutes it takes to set one up. EasyKanban's free plan covers 3 boards with unlimited cards and up to 3 team members per board, which is past the point where the sheet started fighting you.
About EasyKanban
EasyKanban is a free, minimal kanban board that starts instantly without signup, then saves and syncs once you decide to keep it. Unlimited cards on every plan; Pro adds unlimited boards, board history and export.
Try EasyKanban Free →References and Further Reading:
- Google's FILTER function reference - full syntax and examples
- Google Apps Script custom menu guide - the onOpen/createMenu pattern used above
