Build a guided onboarding tour for Sheets
Walk Northwind's first-time users through dialogs — each step explains one feature.
Published Oct 19, 2025
When Northwind hands a shared spreadsheet to a new team member, the tabs and custom menus make sense to whoever built them and nobody else. The usual fix is a “read me” tab that everyone ignores, or a colleague walking each newcomer through it in person — neither scales.
This script gives the sheet its own guided tour. The first time someone opens it, a sequence of dialogs walks them through the key features, one step at a time. Once they have seen it, the tour stays out of the way — but a menu item lets anyone replay it whenever they like.
What you’ll need
- A bound script — open the spreadsheet, then Extensions → Apps Script — so the tour runs inside that sheet.
- The tour copy itself: a short list of steps, written in the
stepsarray, one string per feature you want to explain. - Nothing else.
PropertiesServiceremembers who has seen the tour and needs no setup.
The script
// The tour content — one string per step. Edit these to match the
// sheet you are onboarding people into.
const TOUR_STEPS = [
'Welcome. The Clients tab lists every active retainer.',
'The Projects tab tracks work in flight.',
'Run "Northwind → Sync" to refresh all data.',
];
// Key used to remember, per user, that the tour has been completed.
const SEEN_KEY = 'onboarded';
/**
* Runs on open. Shows the tour to first-time users and always adds
* the Northwind menu so the tour can be replayed.
*/
function onOpen() {
// 1. Show the tour automatically only if this user has not seen it.
const seen = PropertiesService.getUserProperties().getProperty(SEEN_KEY);
if (!seen) showTour(0);
// 2. Add a menu item so anyone can replay the tour on demand.
SpreadsheetApp.getUi()
.createMenu('Northwind')
.addItem('Show tour', 'startTour')
.addToUi();
}
/**
* Menu handler — starts the tour from the first step.
*/
function startTour() {
showTour(0);
}
/**
* Shows one tour step, then recurses to the next. When the steps run
* out, it records that this user has finished the tour.
* @param {number} step - Zero-based index of the step to show.
*/
function showTour(step) {
const ui = SpreadsheetApp.getUi();
// 1. Past the last step — mark the tour done and stop.
if (step >= TOUR_STEPS.length) {
PropertiesService.getUserProperties().setProperty(SEEN_KEY, 'yes');
return;
}
// 2. Show this step as a numbered dialog.
ui.alert('Step ' + (step + 1), TOUR_STEPS[step], ui.ButtonSet.OK);
// 3. Advance to the next step.
showTour(step + 1);
}
How it works
onOpenruns automatically every time the spreadsheet is opened. It checksPropertiesService.getUserPropertiesfor theonboardedflag, which is stored per user — so the tour follows the person, not the file.- If that user has no flag, this is their first visit, so
onOpencallsshowTour(0)to begin the tour at step one. - Either way,
onOpenbuilds aNorthwindmenu with a Show tour item, so the tour is always available to replay. startTouris the menu handler — it simply callsshowTour(0)to run the tour again from the start, ignoring the seen flag.showTourdisplays one step at a time. It shows the current step in a numberedui.alertdialog, waits for the user to click OK, then calls itself with the next index.- When the index passes the last step,
showTourwrites theonboardedflag into user properties and returns, ending the recursion. That user will not see the tour automatically again.
Example run
A new colleague opens the shared sheet for the first time. Three dialogs appear in turn:
Step 1 — Welcome. The Clients tab lists every active retainer.
Step 2 — The Projects tab tracks work in flight.
Step 3 — Run “Northwind → Sync” to refresh all data.
After clicking through, the onboarded flag is set. The next time they open
the sheet, no dialogs appear — but Northwind → Show tour is there if they
want a refresher.
Run it
The tour wires itself up — there is no trigger to configure:
- Paste the script into the sheet’s bound Apps Script project and save.
- Reload the spreadsheet so
onOpenruns. - Approve the authorisation prompt the first time.
- The tour shows automatically for a first-time viewer; everyone else finds it under the Northwind menu.
Watch out for
onOpenis a simple trigger and runs with limited permissions.ui.alertandPropertiesServiceare allowed; calls that need broader authorisation (such asUrlFetchApp) would fail from here.- The seen flag is per user and per script. A user who opens a copy of the sheet, or whose script properties are cleared, sees the tour again.
- The tour blocks the sheet while it runs — each
ui.alertwaits for a click. Keep it to a handful of short steps; a long tour becomes an obstacle. showTourrecurses once per step. That is fine for a few steps, but it is not built for dozens — for a long tour, switch to a loop or a singleHtmlServicedialog with Next buttons.- If
onOpenerrors before the menu is added — for example a typo in the steps array — the Northwind menu will not appear at all. Test edits before sharing the sheet.
Related
Build a branded approval interface
Approve Northwind requests through a custom UI — clients click, decision is logged.
Updated Nov 8, 2025
Build an interactive quiz or assessment app
Run Northwind tests with scoring and feedback — questions in a Sheet, results in another.
Updated Nov 4, 2025
Build a multi-page web app with routing
Structure a real Northwind app across views — query-param routing, shared layout.
Updated Oct 31, 2025
Build a form-to-PDF web service
Convert Northwind form submissions to PDFs on the fly — POST in, PDF out.
Updated Oct 27, 2025
Build an expiring secure-download generator
Issue time-limited Northwind links via a web app — token in URL, server-side check.
Updated Oct 23, 2025