This chapter covers the core features and capabilities of Google Apps Script Starter Kit.
| File | Description |
|---|---|
apps-script/send-bulk-email.gs | Send personalized emails to a list from Sheets (mail merge) |
apps-script/email-tracker.gs | Track email opens with a tracking pixel |
apps-script/scheduled-reminders.gs | Send reminder emails based on date conditions |
apps-script/digest-email.gs | Weekly digest of spreadsheet changes |
apps-script/auto-reply-filter.gs | Auto-categorize and reply to incoming emails |
| File | Description |
|---|---|
apps-script/form-to-sheet.gs | Process form submissions with validation and notifications |
apps-script/data-validation.gs | Validate sheet data against rules and flag errors |
apps-script/auto-numbering.gs | Auto-generate sequential IDs on new row insertion |
apps-script/duplicate-detector.gs | Find and highlight duplicate rows |
apps-script/conditional-formatting-advanced.gs | Dynamic formatting beyond built-in rules |
| File | Description |
|---|---|
apps-script/sheet-to-sheet-sync.gs | Sync data between spreadsheets on a schedule |
apps-script/json-api-import.gs | Pull JSON data from any REST API into Sheets |
apps-script/cross-sheet-lookup.gs | VLOOKUP across multiple spreadsheets |
apps-script/backup-to-drive.gs | Automated spreadsheet backups to Drive folder |
| File | Description |
|---|---|
apps-script/daily-report.gs | Auto-generate and email daily summary reports |
apps-script/sheet-to-pdf.gs | Export sheets as formatted PDFs to Drive/email |
apps-script/chart-to-slack.gs | Generate chart images and post to Slack webhook |
apps-script/pivot-summary.gs | Auto-refresh pivot summaries on a schedule |
| File | Description |
|---|---|
apps-script/calendar-sync.gs | Create/update calendar events from sheet rows |
apps-script/meeting-prep.gs | Auto-generate meeting prep docs from calendar |
apps-script/availability-finder.gs | Find common free time across multiple calendars |
| File | Description |
|---|---|
apps-script/sidebar-ui.gs | Custom sidebar interface with HTML/CSS |
apps-script/custom-menu.gs | Add custom menu items to your spreadsheet |
apps-script/sheet-protection.gs | Dynamic sheet/range protection based on user roles |
| File | Description |
|---|---|
docs/SETUP.md | How to add scripts, set triggers, authorize scopes |
docs/IMPORT-GUIDE.md | Importing scripts into existing spreadsheets |
docs/CUSTOMIZATION.md | How to adapt each script to your needs |
docs/GETTING-STARTED.md | Your first automation in 5 minutes |
formulas/FORMULAS.md | Companion formulas that work with the scripts |
sheets/script-inventory.csv | Reference sheet tracking all scripts and their triggers |
1. Open any Google Spreadsheet
2. Go to Extensions → Apps Script
3. Delete the default myFunction() code
4. Paste the contents of any .gs file
5. Save (Ctrl+S)
6. Run the function (click â–¶ or set up a trigger)
7. Authorize when prompted (see docs/SETUP.md for scope details)
Complexity in Google Apps Script is driven less by line count than by state, permissions, failure recovery, and the number of services involved. Start at the lowest level that solves the workflow, then add structure when users or data dependencies grow.
Level 1 scripts modify one spreadsheet in response to a manual action or simple trigger. Typical jobs include numbering rows, formatting cells, or reacting to an edit. Read and write ranges in batches because calls to Sheets are much slower than JavaScript operations:
function stampNewRows() {
const sheet = SpreadsheetApp.getActive().getSheetByName('Orders');
const rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2).getValues();
sheet.getRange(2, 3, rows.length, 1)
.setValues(rows.map((row, i) => [row[0] && !row[1] ? `ORD-${i + 1}` : '']));
}Use the included auto-numbering.gs, duplicate-detector.gs, and conditional-formatting-advanced.gs as starting templates. Add an installable time or edit trigger when the script needs authorization that a simple onEdit trigger cannot obtain.
Level 2 coordinates tabs or separate spreadsheets, validates inputs, and records processing state. Give columns stable headers, validate before moving data, and use LockService to prevent two trigger executions from processing the same row:
function validateStatus() {
const sheet = SpreadsheetApp.getActive().getSheetByName('Intake');
const rule = SpreadsheetApp.newDataValidation()
.requireValueInList(['New', 'Approved', 'Rejected'], true)
.setAllowInvalid(false).build();
sheet.getRange('D2:D').setDataValidation(rule);
}Relevant templates are form-to-sheet.gs, data-validation.gs, cross-sheet-lookup.gs, and sheet-to-sheet-sync.gs. Add a “Processed At” value only after every dependent write succeeds so retries remain safe.
Level 3 crosses service boundaries: Gmail mail merges, Calendar synchronization, Drive backups, Slack webhooks, or third-party REST APIs. Expect OAuth scopes, quotas, pagination, HTTP errors, and rate limits. Store tokens in Script Properties—not cells—and retry only transient failures:
function fetchOrders() {
const token = PropertiesService.getScriptProperties().getProperty('API_TOKEN');
const response = UrlFetchApp.fetch('https://api.example.com/orders', {
headers: {Authorization: `Bearer ${token}`},
muteHttpExceptions: true
});
if (response.getResponseCode() !== 200) throw new Error(response.getContentText());
return JSON.parse(response.getContentText());
}Begin with json-api-import.gs, send-bulk-email.gs, calendar-sync.gs, backup-to-drive.gs, or chart-to-slack.gs. Review requested scopes before deployment and log external IDs to make syncs idempotent.
Level 4 adds custom menus, HTML sidebars or dialogs, and possibly a deployed web app. Separate UI handlers from sheet services, validate every browser-supplied value server-side, and use google.script.run asynchronously:
function onOpen() {
SpreadsheetApp.getUi().createMenu('Operations')
.addItem('Open dashboard', 'showDashboard').addToUi();
}
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index').setTitle('Operations');
}The kit’s custom-menu.gs and sidebar-ui.gs provide the included Level 4 building blocks; adapt them into dialogs or a web entry point as needed.
Move to a proper backend when execution regularly approaches six minutes, concurrent users contend for locks, data exceeds practical spreadsheet size, secrets need stronger isolation, or the product requires queues, database transactions, observability, strict latency, or public APIs. A common transition keeps Sheets as the operator interface while Cloud Run, a database, and a job queue perform durable work. Upgrade based on reliability requirements—not simply because the script became long.
Get the full Google Apps Script Starter Kit and unlock everything.
Get the complete guide with every chapter unlocked, including code samples, diagrams, and best practices.
Access all interactive tools with complete data, all workload profiles, and the full scenario library.
Downloadable source code, configuration files, and working examples from every chapter.
Free updates for life. Every new chapter, tool, and improvement included.