Turn a spreadsheet into your first automation. Follow the objects, write the methods, and see what your script changes.
30 workshops · Built-in services · Beginner to builder
YOUR FIRST AUTOMATION
01 / READGet the task list02 / TRANSFORMFind what needs attention03 / ACTBuild a useful report
getValues() → setValues()
Small methods. Useful outcomes.
A practice space, not your Google account. Your JavaScript runs in an isolated browser worker against a simulated subset of Apps Script. No real files, emails or triggers are created. Move to Google when ready →
0 / 30workshops checked
YOUR MISSION
Predict before you codePractice data and expected checks
Default: Tasks has headers Name / Minutes / Status and rows Ada / 30 / Open, Sam / 45 / Done, Lee / 20 / Open. Report starts empty. The bound file is Practice book (book-demo). Every check resets the fixture; some use changed inputs.
Entry point: main()
Runs stop after 3 seconds. Ctrl/⌘ + Enter runs your script. This educational simulator supports the methods used by these lessons; it does not reproduce Google authorization, quotas, latency or every API behavior.
Write your code, then run it to see what happens.
Pause. Explain. Remember.
SEE THE SHAPE OF YOUR DATA
Cells outside. Arrays inside.
Choose a rectangle to see how one-based spreadsheet coordinates become zero-based JavaScript indexes. This explorer uses the fixed Tasks fixture.
getValues() returns
Method coach
setValues() needs exactly the same number of rows and columns as its destination range. An empty result needs a guard, not a zero-height range.
FOLLOW THE RETURN VALUE
The method map.
A service gives you an object. That object exposes methods. Follow the chain to see where each operation belongs.
SpreadsheetApp→ Spreadsheet→ Sheet→ Range→ Value / Array
FROM PRACTICE TO A REAL PROJECT
Your first real automation.
Bound: start inside Sheets
Create a disposable spreadsheet. Name one tab Tasks and another Report.
Open Extensions → Apps Script. Paste one workshop’s downloaded Code.gs.
Save, choose main in the function selector, and click Run.
Review the requested permissions, then inspect Executions and your practice file. To see a returned value, temporarily add a wrapper such as function inspect() { Logger.log(main()); } and run inspect.
To add a menu, put the workshop 15 statements in onOpen(e) and define buildReport(). Reopen the spreadsheet. A simple onOpen can build a menu; services requiring authorization belong in a suitable authorized handler.
Use a practice spreadsheet with the same Tasks and Report tabs.
Replace book-demo with its real spreadsheet ID. Replace other fictional file, folder and recipient values only when needed.
Run manually first. Confirm outputs and what a repeated run does.
For a schedule, define the named handler and install one trigger. Review the trigger creator’s access.
A standalone or background job should explicitly open its target file. A bound script deployed as a web app does not have the same active-editor context as one run from the editor.
Build a dependable workflow
Input: validate required settings, headers and values.
Work: read in batches, compute locally, write in batches.
Reruns: replace a report deliberately; deduplicate drafts and file copies.
Failure: plan for an operation that succeeds before the next one fails.
Ownership: document who installed triggers and which account runs them.
Browser checks compare outcomes on fictional fixtures. They are learning feedback, not production certification. Formula evaluation, rich formatting, complex permissions, real HTTP requests, trigger delivery and concurrent executions are not simulated.