Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

You can use Google Sheets and Google Apps Script to poll a website on a schedule, save each result in a history tab, and email yourself when a status or selected page value changes. It is polling—not a spreadsheet edit trigger—so alerts arrive only after a scheduled check runs. This approach suits a small number of pages and a lightweight log; it requires you to own the script, permissions, and error handling.

How the monitoring workflow works

  1. Store each target URL and the condition you care about in a Google Sheet.
  2. Run an Apps Script function on a time-driven trigger. It requests each page or endpoint.
  3. Extract a status code or stable piece of content relevant to the condition.
  4. Append a timestamped result to a history tab and compare it with the previous result.
  5. Send an alert when the monitored condition changes, and decide separately whether to report recovery.

Apps Script can use time-driven triggers and work with Sheets and external services. Google describes a time-driven trigger as “similar to a cron job in Unix.” The execution time can be slightly randomized, however, so this is not a real-time notification system. Google Apps Script: Installable Triggers · Apps Script and Google Sheets

Choose a condition that is useful to monitor

Availability

Record the HTTP response status, and optionally the time taken for the request. Define what counts as a failure: for example, whether only a successful response is acceptable or whether a redirect is also expected. A status check confirms what the request received; it does not prove that a page rendered correctly in a browser.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Meaningful content changes

Compare a selected text fragment or extracted value, such as a published price or an availability label, rather than the entire HTML response. Navigation, advertisements, timestamps, and other dynamic elements can change frequently without reflecting a meaningful update. The extraction rule depends on the target page; there is no universal best selector or method.

#1 Best Overall
Sale
The Google Workspace Bible: [14 in 1] The Ultimate All-in-One Guide from Beginner to Advanced | Including Gmail, Drive, Docs, Sheets, and Every Other App from the Suite
  • The Google Workspace Bible: [14 in 1] The Ultimate All in One Guide from Beginner to Advanced Including Gmail, Drive, Docs, Sheets, and Every Other App from the Suite
  • ABIS BOOK

Business-critical endpoints

Decide in advance how many consecutive failed checks should trigger an alert, whether recovery should generate a separate message, and who should receive notifications. These are operating choices, not guarantees provided by Apps Script. A single transient request failure may not represent a persistent outage.

Set up a simple status-and-change monitor

1. Create the Sheet

Create a tab named Targets with these columns in row 1: URL, Last status, Last checked. Add the pages to monitor in column A, starting in row 2. Create a second tab named History for timestamped observations.

2. Add the Apps Script

In the Sheet, select Extensions > Apps Script. Replace the starter code with the following, changing alert@example.com to an address you control. This version checks HTTP status and emails when that status differs from the value previously recorded.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
function checkWebsites() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const targets = ss.getSheetByName('Targets');
  const history = ss.getSheetByName('History');
  const email = 'alert@example.com';
  const lastRow = targets.getLastRow();
  if (lastRow < 2) return;

  const rows = targets.getRange(2, 1, lastRow - 1, 3).getValues();
  const now = new Date();

  rows.forEach((row, index) => {
    const url = row[0];
    if (!url) return;

    const previousStatus = row[1];
    let status;
    let detail;
    try {
      const response = UrlFetchApp.fetch(String(url), {
        muteHttpExceptions: true,
        followRedirects: true
      });
      status = response.getResponseCode();
      detail = 'HTTP ' + status;
    } catch (error) {
      status = 'ERROR';
      detail = String(error);
    }

    history.appendRow([now, url, status, detail]);
    targets.getRange(index + 2, 2, 1, 2).setValues([[status, now]]);

    if (previousStatus !== '' && String(previousStatus) !== String(status)) {
      MailApp.sendEmail(
        email,
        'Website monitor: status changed',
        url + 'nPrevious status: ' + previousStatus +
          'nCurrent status: ' + status + 'nChecked: ' + now
      );
    }
  });
}

The script logs a failed fetch as ERROR when Apps Script throws an exception. With muteHttpExceptions: true, HTTP error responses are returned so their status codes can be recorded rather than thrown. This is a basic example: it sends an email on any status transition after the first stored result, including a change from an error back to an HTTP status.

3. Run once and authorize

In the Apps Script editor, choose checkWebsites in the function selector and click Run. Review and grant the requested permissions for spreadsheet access, external requests, and email. Check that a row appears in History and that the status and check time update in Targets. On the first run, the script stores a baseline without emailing because there is no prior status to compare.

4. Add a schedule

In Apps Script, open Triggers (the clock icon), select Add Trigger, choose checkWebsites, set the event source to Time-driven, and choose an interval. Google documents time-driven triggers as available as often as every minute, but the actual execution time can vary slightly; do not promise an exact check time or instant delivery. Google’s trigger documentation

Understand triggers, ownership, and authorization

onEdit(e) is not the way to monitor an external page: Google’s simple edit trigger runs when a user changes a spreadsheet value. Installable change triggers cover spreadsheet structure changes, such as adding a sheet or removing a column. For a website check, use a time-driven trigger or an external monitoring service. Google Apps Script trigger types · Installable trigger behavior

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

An installable trigger runs with the authorization of the account that created it. Give the deployment a clear owner, keep that account active and authorized, and make sure the alert recipient is correct. Script executions and API requests do not themselves fire installable triggers, so writing a cell through code or an API is not a substitute for scheduling the monitoring function.

Adapt the script for content changes

For a page-change alert, replace the status comparison with an extracted value. For example, after fetching the page, extract a stable text or value from the response and store it alongside the timestamp. Compare that value to the prior value in the target row, and include only the changed value in the alert. The example above does not parse HTML or render JavaScript; choose an extraction method appropriate to the site and test it against real responses. Some sites require browser rendering or block automated requests, and behavior varies by target.

Follow the target site’s published terms and test whether it allows automated requests before monitoring it. A successful HTTP response may contain an error page, a bot challenge, or content different from what a visitor sees in a browser.

Troubleshooting common problems

  • No scheduled runs: Open the Apps Script project’s Triggers page and verify that the time-driven trigger exists and points to checkWebsites. Check execution history for authorization or runtime errors.
  • Authorization errors: Run the function manually while signed in as the trigger owner, review the permission prompts, and reauthorize if access was revoked.
  • Unexpected status or empty content: The target may redirect, block automated requests, require JavaScript, or return different content to non-browser clients. Inspect the response and verify that the target’s terms permit automated access; a basic fetch is not a browser renderer.
  • Too many alerts: Compare a stable extracted value instead of the whole page, or define a consecutive-failure threshold and a distinct recovery rule. The sample sends on every status change.
  • History is growing too quickly: Each successful scheduled check appends a row. Choose a suitable interval and define how long to retain history; Google Sheets does not automatically manage this example’s retention.
  • Email is missing: Check the execution record for mail errors, confirm the recipient address, and confirm that the run has the required authorization.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

When a hosted monitor is a better fit

Apps Script plus Sheets is flexible and transparent, but you own the extraction logic, trigger, logging, permissions, and upkeep. It fits a lightweight record or a small set of pages. A hosted monitoring service may be a better operational choice when reliability, scale, or less script maintenance matters; verify the provider’s check behavior, alert integrations, and costs directly. The available documentation does not establish a particular provider’s pricing, plan limits, or direct Sheets connector.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Google Cloud Monitoring documents notification channels and alerting, but that does not establish a direct Google Sheets integration. Its webhook notification channel requires a publicly reachable endpoint. Google Cloud Monitoring notification options

Or skip the browser setup

If the thing you need to track is a visual screenshot, one GET request to ScreenshotNeo can return an image or PDF; it is a screenshot API and MCP server, not a replacement for the Sheets polling and comparison logic above. Example with cURL (see the ScreenshotNeo API docs):

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

ScreenshotNeo accepts cookie or consent banners and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. Bot checks, blank pages, failed loads, timeouts, and cache hits are not billed, and responses identify the page verdict and billing status in headers. Its MCP server offers screenshot, page-info, and PDF-capture tools for AI agents. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000 screenshots. Sign up free for ScreenshotNeo.

Frequently Asked Questions

Can a Google Sheets edit trigger detect a website change?

No. An edit trigger responds to spreadsheet edits; external pages must be checked separately by a scheduled fetch or monitoring service.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Will a time-driven trigger run at the exact minute I choose?

No. Google says execution timing may be slightly randomized, so a check interval is not a promise of precise alert timing.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.