Contents

Chapter 1

What's Included

This chapter covers the core features and capabilities of Google Apps Script Starter Kit.

What's Included

Email & Communication (5 scripts)

FileDescription
apps-script/send-bulk-email.gsSend personalized emails to a list from Sheets (mail merge)
apps-script/email-tracker.gsTrack email opens with a tracking pixel
apps-script/scheduled-reminders.gsSend reminder emails based on date conditions
apps-script/digest-email.gsWeekly digest of spreadsheet changes
apps-script/auto-reply-filter.gsAuto-categorize and reply to incoming emails

Form & Data Processing (5 scripts)

FileDescription
apps-script/form-to-sheet.gsProcess form submissions with validation and notifications
apps-script/data-validation.gsValidate sheet data against rules and flag errors
apps-script/auto-numbering.gsAuto-generate sequential IDs on new row insertion
apps-script/duplicate-detector.gsFind and highlight duplicate rows
apps-script/conditional-formatting-advanced.gsDynamic formatting beyond built-in rules

Data Sync & Integration (4 scripts)

FileDescription
apps-script/sheet-to-sheet-sync.gsSync data between spreadsheets on a schedule
apps-script/json-api-import.gsPull JSON data from any REST API into Sheets
apps-script/cross-sheet-lookup.gsVLOOKUP across multiple spreadsheets
apps-script/backup-to-drive.gsAutomated spreadsheet backups to Drive folder

Reports & Export (4 scripts)

FileDescription
apps-script/daily-report.gsAuto-generate and email daily summary reports
apps-script/sheet-to-pdf.gsExport sheets as formatted PDFs to Drive/email
apps-script/chart-to-slack.gsGenerate chart images and post to Slack webhook
apps-script/pivot-summary.gsAuto-refresh pivot summaries on a schedule

Calendar & Scheduling (3 scripts)

FileDescription
apps-script/calendar-sync.gsCreate/update calendar events from sheet rows
apps-script/meeting-prep.gsAuto-generate meeting prep docs from calendar
apps-script/availability-finder.gsFind common free time across multiple calendars

Utilities (3 scripts)

FileDescription
apps-script/sidebar-ui.gsCustom sidebar interface with HTML/CSS
apps-script/custom-menu.gsAdd custom menu items to your spreadsheet
apps-script/sheet-protection.gsDynamic sheet/range protection based on user roles

Documentation & Setup

FileDescription
docs/SETUP.mdHow to add scripts, set triggers, authorize scopes
docs/IMPORT-GUIDE.mdImporting scripts into existing spreadsheets
docs/CUSTOMIZATION.mdHow to adapt each script to your needs
docs/GETTING-STARTED.mdYour first automation in 5 minutes
formulas/FORMULAS.mdCompanion formulas that work with the scripts
sheets/script-inventory.csvReference sheet tracking all scripts and their triggers

Quick Start

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)

Chapter 2

Script Complexity Levels

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: simple automation

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:

javascript
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: multi-sheet workflows

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:

javascript
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: service and API integration

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:

javascript
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: full applications

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:

javascript
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.

When Apps Script is no longer enough

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.

Chapter 3
đź”’ Available in full product

Support

You’ve reached the end of the free preview

Get the full Google Apps Script Starter Kit and unlock everything.

All Chapters

Get the complete guide with every chapter unlocked, including code samples, diagrams, and best practices.

Full Tool Suite

Access all interactive tools with complete data, all workload profiles, and the full scenario library.

Source Files

Downloadable source code, configuration files, and working examples from every chapter.

Lifetime Updates

Free updates for life. Every new chapter, tool, and improvement included.

Buy Now — $49 →
📦 Free sample included — download another copy or visit the store for the full product.
Google Apps Script Starter Kit v1.0.0 — Free Preview