Google Apps Script lets you automate Gmail, Sheets, Drive and Calendar with no infrastructure. Very accessible, it also has its blind spots. An honest overview of what this tool can and cannot do.
Since its launch in 2009, Google Apps Script (GAS) is the native automation tool for Google Workspace. A hosted JavaScript environment, running in Google's cloud, with direct access to all G Suite services. No server to manage, no deployment pipeline, no usage billing. For many teams, it's the gateway to office automation.
But like any tool, it has its strengths and limits. Knowing them before committing saves unpleasant surprises.
What Google Apps Script does very well
Automating repetitive tasks on Google data
This is the most common and most solid use case. Google Sheets becomes a mini-backend: importing data from an external API, automated calculations, programmatic conditional formatting, PDF report generation.
function generateMonthlyReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('Data');
const data = sheet.getDataRange().getValues();
// Filter rows for the current month
const now = new Date();
const monthRows = data.filter(row => {
const date = new Date(row[0]);
return date.getMonth() === now.getMonth()
&& date.getFullYear() === now.getFullYear();
});
// Create a Google Doc with the results
const doc = DocumentApp.create('Report ' + Utilities.formatDate(now, 'Europe/London', 'MM/yyyy'));
const body = doc.getBody();
body.appendParagraph('Monthly Report').setHeading(DocumentApp.ParagraphHeading.HEADING1);
monthRows.forEach(row => body.appendParagraph(row.join(' β ')));
doc.saveAndClose();
}
Orchestrating Gmail
Sort, label, archive, reply, forward based on complex criteria β everything native Gmail filters can't do. GAS accesses the full Gmail API with the same power as the web client.
Reacting to Google Forms submissions
Each form submission can trigger a script: send a personalized confirmation email, create an entry in a CRM via API, provision access in another service.
Creating lightweight interfaces with HtmlService
GAS can serve simple HTML pages hosted by Google. Useful for internal forms, lightweight dashboards, serverless admin tools.
Connecting services via UrlFetchApp
Inbound and outbound HTTP calls: Slack webhooks, REST API calls, integrations with third-party services. GAS can act as glue between multiple services.
Limits you discover too late
Execution quotas
This is the first wall. Google imposes strict limits:
| Resource | Limit (free account) | Limit (Workspace) |
|---|---|---|
| Execution duration per script | 6 minutes | 6 minutes |
UrlFetchApp calls per day |
20,000 | 100,000 |
Emails sent via GmailApp |
100/day | 1,500/day |
| Simultaneous triggers | 20 | 20 |
A script running on a Spreadsheet with 100,000 rows quickly hits the 6-minute limit. You then need to split the processing, save state in script properties, and chain executions β which quickly complicates the code.
Error handling is silent by default
A script that crashes at 3am in an hourly trigger sends no automatic alert unless explicitly configured. Post-mortem debugging is painful: logs are limited to 50 lines per execution and disappear after a few days.
function scriptWithErrorHandling() {
try {
// business logic
} catch(e) {
// Without this, you'll never know it crashed
GmailApp.sendEmail(
'admin@mydomain.com',
'[ERROR] Script ' + ScriptApp.getScriptId(),
e.message + '\n\n' + e.stack
);
}
}
No dependency management
GAS has no npm, no package.json, no importing external libraries. There is a proprietary Google library system, but it is limited. To use a third-party lib, you need to copy-paste the source code directly into the editor.
The runtime is V8, not Node
Since 2020, GAS runs on the V8 engine, which allows modern ES6+ syntax. But it is an isolated environment: no filesystem access, no arbitrary DNS queries, no sockets. Only what Google exposes through its APIs.
Collaboration and versioning are rudimentary
The built-in editor is not VS Code. No native Git branches. CLASP (the official CLI tool) allows working locally and pushing to Google, but it's an additional layer to configure. For a team of several developers, the friction is real.
Strong coupling with Google
An automated system built entirely on GAS is difficult to port. If your organization migrates to Microsoft 365, everything needs to be rewritten. This coupling is often acceptable β the question is to choose it consciously.
When to use GAS, when not to
GAS is the right tool when:
- The scope is clearly within the Google Workspace ecosystem
- Data volumes are reasonable (a few thousand rows, not millions)
- The logic is simple to moderately complex
- Execution delays of a few minutes are acceptable
- The team is small or the script is maintained by a single person
Prefer another solution when:
- Volumes or execution frequency exceed quotas
- Reliability and traceability are critical (production, billing, compliance)
- Multiple developers need to collaborate on the code
- Business logic is complex and warrants serious unit testing
- You need libraries that GAS cannot bundle
In these cases, a Cloud Function (GCP), AWS Lambda service, or even a simple cron on a server will give you more control, reliability and maintainability.
CLASP β working with GAS like a developer
The clasp CLI tool allows developing locally and deploying to Google Apps Script.
npm install -g @google/clasp
clasp login
clasp clone <script-id>
# edit locally with your favorite editor
clasp push
Coupled with a Git repository, this is a significant workflow improvement. You get modern TypeScript syntax (clasp supports TS β JS compilation), your usual IDE, and a clean version history.
In summary
Google Apps Script is a remarkably accessible tool for automating tasks within Google Workspace. It lowers the bar to automation for non-developer profiles, and offers real power for contained use cases.
Its limits β quotas, lack of dependencies, difficult debugging, Google coupling β are acceptable when known in advance. They become serious problems when discovered in production.
The rule of thumb: GAS for the glue, not for the engine.