A flexible, drag-and-drop Kanban board powered by Google Sheets and Apps Script. Works with any column structure—just needs 3 required columns
- Go to Google Sheets and create a new spreadsheet
- Name it something like "Kanban Board" or "Project Tasks"
- Rename the first sheet to
Tasks(exactly this name, case-sensitive) - Add column headers in Row 1 with this structure:
| Task ID | Task | Status | Priority | Due Date | Notes |
|---|---|---|---|---|---|
| Build login page | In Progress | High | 2024-02-15 | Use OAuth | |
| Write documentation | Not Started | Medium |
Required columns (in this order):
Task ID- Column A. Leave cells empty—UUIDs are auto-generatedTask- The card title displayed on the Kanban boardStatus- Defines which Kanban column the task appears in
Important: Create the
Task IDcolumn header in column A, but leave the cells empty. The system automatically generates unique IDs for each task.
Optional: Add any other columns you need (Priority, Due Date, Notes, etc.)—they'll automatically appear in the add/edit modal.
Adding tasks directly in the spreadsheet? See Step 7b: Enable Auto Task IDs to have IDs generated automatically when you add rows.
Tip: You can sort or filter your
Taskssheet by any column (Priority, Due Date, etc.) without affecting the Kanban board order. The board remembers the order you set by dragging cards. The system automatically creates and hides an "Order" column to manage this—you don't need to worry about it.
For each column that needs a dropdown, create a sheet named Picklist_{ColumnName}.
Example: Status Options
Create a sheet named Picklist_Status:
| Value | Color |
|---|---|
| Not Started | #95a5a6 |
| In Progress | #3498db |
| Blocked | #e74c3c |
| Complete | #27ae60 |
Example: Priority Options
Create a sheet named Picklist_Priority:
| Value | Color |
|---|---|
| High | #e74c3c |
| Medium | #f39c12 |
| Low | #27ae60 |
How Picklist Sheets Work:
- Sheet name format:
Picklist_{ColumnName}(case-insensitive) - Underscores in sheet names become spaces:
Picklist_Work_Stream→ matches columnWork Stream - Value: The dropdown option text
- Color: Hex color code for visual distinction (optional)
Any column with a matching Picklist sheet becomes:
- A dropdown in the add/edit modal
- A filter option in the header bar
The Picklist_Status sheet is special—it defines your Kanban columns.
Note: If no
Picklist_Statussheet exists, a default one is auto-created.
If you want to manage team members separately with email linking:
- Create a new sheet named
Owners(exactly this name, case-sensitive) - Set up the following structure in Row 1:
| Name | Color | |
|---|---|---|
| Marc Smith | marc@example.com | #3498db |
| Jane Doe | jane@example.com | #9b59b6 |
How Owners Works:
- Name: Display name shown in Kanban dropdowns and filter
- Email: Google account email (optional, for reference)
- Color: Hex color code for visual distinction (optional)
Note: The Owners sheet is auto-created when you first load the Kanban board.
To allow users to use @mentions with Smart Chips in the spreadsheet:
- Select the Owner column in your Tasks sheet (e.g., column F)
- Go to Data → Data validation
- Set criteria to: Dropdown (from a range) →
Owners!A2:A - Uncheck "Reject input" to allow
@override - Click Done
Now users can either:
- Pick from dropdown (plain text, fast)
- Type
@to get a Smart Chip with profile picture (overrides dropdown)
| Sheet Type | Purpose | Examples |
|---|---|---|
| Picklist_{Column} | Task attributes with predefined options | Picklist_Status, Picklist_Priority, Picklist_Phase |
| Owners | Team members with email addresses | People who can be assigned to tasks |
Why separate structures?
- Picklist sheets store simple value + color pairs (2 columns)
- Owners stores names, email addresses, AND colors (3 columns)
- When you select an Owner, the name becomes a clickable email link
- Keeps people management separate from workflow configuration
- In your Google Spreadsheet, go to Extensions → Apps Script
- This opens the Apps Script editor in a new tab
- The editor opens with a default
Code.gsfile - Delete all existing code in that file
- Copy the entire contents of
Code.gsfrom this repository - Paste it into the editor
- Click the + button next to "Files" in the left sidebar
- Select HTML
- Name the file
Index(without .html extension—Apps Script adds it automatically) - Delete any default content in the new file
- Copy the entire contents of
index.htmlfrom this repository - Paste it into the editor
Your project should now have two files:
Code.gsIndex.html
- Click File → Save or press
Ctrl+S/Cmd+S - If prompted, name your project (e.g., "Kanban Board")
If you plan to add tasks directly in the spreadsheet (not just through the Kanban UI), run this one-time setup to automatically generate Task IDs:
- In the Apps Script editor, click on the function dropdown (top toolbar, says "Select function")
- Select
setupOnEditTrigger - Click Run (▶ button)
- Authorize when prompted (same permissions as before)
What this does:
- Generates Task IDs for any existing tasks that don't have one (backfill)
- Automatically generates Task IDs for new rows added in the future
- You never need to manually enter Task IDs
Tip: Don't edit the Task ID column directly—let the system manage it. You can protect column A if you want to prevent accidental edits (Data → Protect sheets and ranges).
- Click Deploy → New deployment
- Click the gear icon ⚙️ next to "Select type" and choose Web app
- Fill in the deployment settings:
- Description: "Kanban Board v1" (or any description)
- Execute as: "Me" (your account)
- Who has access: Choose based on your needs:
- "Only myself" - Only you can access
- "Anyone with Google account" - Requires sign-in
- "Anyone" - Public access (use with caution)
- Click Deploy
- Click Authorize access when prompted
- Choose your Google account
- Click Advanced → Go to [Project Name] (unsafe)
- Click Allow to grant permissions
The app needs permission to:
- Read and write to your spreadsheet
- Display web content
- Copy the Web app URL shown after deployment
- Open it in your browser
- Bookmark it for easy access!
If you modify the code:
- Go to Deploy → Manage deployments
- Click the pencil icon ✏️ to edit
- Change Version to "New version"
- Click Deploy
- Drag-and-drop tasks between status columns
- Reorder cards within columns - Drag cards up/down within a status column to set priority order
- Sort/filter your sheet freely - The Kanban board order stays intact even when you sort or filter the spreadsheet
- Dynamic columns based on your Picklist sheets
- Filters for any configured field (Priority, Category, etc.)
- Quick search across all task fields (title, notes, owner, etc.)
- Collapsible columns to focus on what matters
- Add, edit, and delete tasks through a clean modal interface
- Works with any spreadsheet structure - bring your own columns
- Unique Task IDs - Auto-generated UUIDs for reliable multi-user support
- Clickable hyperlinks - Links in "Related Docs" or similar columns are clickable on cards
Add rows to your Picklist_Status sheet:
| Value | Color |
|---|---|
| Review | #9b59b6 |
| Testing | #1abc9c |
Refresh your Kanban board to see the new columns.
Create a new Picklist sheet for any column you want as a dropdown/filter.
Example: Add a Category filter
- Create a sheet named
Picklist_Category:
| Value | Color |
|---|---|
| Frontend | #3498db |
| Backend | #e74c3c |
| DevOps | #2ecc71 |
- Add a "Category" column to your Tasks sheet
- Refresh the Kanban board—Category now appears as a dropdown and filter
Use any hex color code for visual distinction:
#e74c3c- Red#f39c12- Orange#27ae60- Green#3498db- Blue#9b59b6- Purple#95a5a6- Gray
You can reorder cards by dragging them up or down within a status column. The order you set persists even if you sort or filter your spreadsheet.
- Within a column: Drag a card up or down to change its position. Drop it above another card to place it before that card, or drop it in an empty area to move it to the end.
- Between columns: Drag a card to a different status column to change its status. It will be added at the position where you drop it.
Good news: You can sort or filter your Tasks sheet by any column (Priority, Due Date, Owner, etc.) without affecting the Kanban board order. The board remembers the order you set by dragging cards, so:
- ✅ Sort by Due Date to see what's coming up
- ✅ Filter by Owner to see someone's tasks
- ✅ Use pivot tables or any other spreadsheet feature
- ✅ The Kanban board order stays exactly as you arranged it
This makes it easy for stakeholders to analyze the data in the spreadsheet while the Kanban board maintains the workflow order you've set up.
You can link documents, URLs, or any web resource to your tasks. The Kanban board automatically detects and displays hyperlinks as clickable links.
-
In your spreadsheet, add a column with a name containing one of these keywords:
link,url,doc,document,related,attachment,file,resource- Examples: "Related Docs", "Document Link", "Attachments", "Resource URL"
-
Add hyperlinks to cells using either method:
- Rich Text link: Select the cell → Insert → Link → paste URL
- HYPERLINK formula:
=HYPERLINK("https://...", "Display Text")
-
On the Kanban board:
- Links appear as clickable blue text on cards
- Clicking the link opens it in a new tab (doesn't open the edit modal)
- In the edit modal, you can view and edit both the display text and URL
| Related Docs |
|---|
| Project Brief |
| Requirements Doc |
The link text ("Project Brief") shows on the card, and clicking it opens the Google Doc.
When editing a task, link fields show two input boxes:
- Link text: The display name shown on the card
- URL: The actual link (https://...)
Make sure your Tasks sheet has a column header named "Status" in Row 1.
- Check that your Tasks sheet is named exactly
Tasks - Make sure you have at least one task with a Status that matches a Config value
- Refresh the browser
- If using a cached deployment, redeploy with a new version
- Make sure you authorized the app to access your spreadsheet
- Try redeploying and re-authorizing
- Make sure you have a
Task IDcolumn header in column A - Open the Kanban board once—it auto-fills missing IDs
- Or run
fillMissingTaskIdsfrom the Apps Script editor - Don't delete or rename this column—it's required for reliable updates
- Run
setupOnEditTriggeronce (see Step 7b) to enable auto-generation - Alternatively, open the Kanban board—it fills in missing IDs automatically
- You can also run
fillMissingTaskIdsmanually from the Apps Script editor
- Go to Data → Protect sheets and ranges
- Click Add a sheet or range
- Select just column A (the Task ID column)
- Click Set permissions and choose "Only you" or specific editors
- This prevents accidental edits while the system still auto-generates IDs
├── Code.gs # Backend: Google Apps Script server code
├── index.html # Frontend: Kanban board UI (HTML/CSS/JS)
└── README.md # This file
MIT License - Feel free to use and modify for your projects.