← Back to blog
Tools

Google Apps Script β€” power and limits of automation in Google Workspace

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.

Have a project in mind?

Let's talk about your challenges and see how Gotan can help.

Contact us