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

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

To capture website screenshots from URLs in Google Sheets, use Apps Script to read the URL rows, call a screenshot service with UrlFetchApp, and put each returned image into the sheet. Google Sheets does not render arbitrary web pages into screenshots by itself: the screenshot service does the browser rendering, while Apps Script connects that service to your spreadsheet.

This guide shows a provider-neutral Apps Script workflow, explains how to schedule it safely, and covers the limits that determine how many captures you can run. API request fields and authentication differ by provider, so use the selected service’s current documentation rather than assuming one endpoint works for all.

What you need before you start

Prepare a Google Sheet with one website URL per row and separate columns for the capture status and result. Choose a screenshot API that can render the pages you need and check how it returns its output: as image bytes or as a hosted image URL. That response format determines how Apps Script inserts the result.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • A Google spreadsheet you can edit.
  • A bound Apps Script project, created from the spreadsheet.
  • An account and API credentials for a screenshot provider.
  • A provider-supported method to retrieve an image as bytes or a publicly accessible URL.

For each API, confirm its authentication method, request parameters, output format, supported image dimensions, JavaScript-rendering behavior, full-page options, rate limits, retention, and price. Those details vary by provider; the Apps Script connection pattern does not make provider-specific settings interchangeable.

#1 Best Overall
Sale
Philips 24 Inch Computer Monitor FHD 100Hz VA VESA Flicker-Free, 241V8LB
  • CRISP CLARITY: This 23.8″ Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
  • INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
  • THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
  • WORK SEAMLESSLY: This sleek monitor is virtually bezel-free on three sides, so the screen looks even bigger for the viewer. This minimalistic design also allows for seamless multi-monitor setups that enhance your workflow and boost productivity
  • A BETTER READING EXPERIENCE: For busy office workers, EasyRead mode provides a more paper-like experience for when viewing lengthy documents

Set up the sheet and Apps Script

  1. Arrange your columns. For example, put URLs in column A, status in column B, and the screenshot or screenshot URL in column C. Add a header row and start processing at row 2.
  2. Open the script editor. In the spreadsheet, select Extensions → Apps Script. This creates a script bound to the spreadsheet, so it can read and update that sheet.
  3. Add the provider’s API details. Follow its current documentation for the endpoint, authentication, and capture parameters. Store credentials carefully; do not expose a private API key in a publicly shared sheet or in code that other editors can inspect.
  4. Run a small test. Start with a few URLs, including a redirecting page if redirects matter to your workflow. Check that the returned image is the expected page and that the result can be inserted into the sheet.

Apps Script’s UrlFetchApp service makes external HTTP and HTTPS requests. The script will need authorization for external requests and spreadsheet writes; Google’s URL Fetch Service documentation describes request and response handling.

Call a screenshot API and insert the result

The example below is a provider-neutral skeleton. Replace the endpoint, authentication, and request fields with the values required by your screenshot provider. It assumes the provider returns image bytes directly. It writes a status for each processed row and inserts the resulting image at the corresponding row in column C.

function captureWebsiteScreenshots() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const firstDataRow = 2;
  const lastRow = sheet.getLastRow();
  if (lastRow < firstDataRow) return;

  // Read the URL column in one operation.
  const urls = sheet
    .getRange(firstDataRow, 1, lastRow - firstDataRow + 1, 1)
    .getValues();

  const statuses = [];
  const apiKey = PropertiesService.getScriptProperties()
    .getProperty('SCREENSHOT_API_KEY');
  if (!apiKey) throw new Error('Set SCREENSHOT_API_KEY in Script Properties.');

  urls.forEach((row, index) => {
    const url = String(row[0] || '').trim();
    if (!url) {
      statuses.push(['Skipped: blank URL']);
      return;
    }
    if (!/^https?:///i.test(url)) {
      statuses.push(['Skipped: enter an http:// or https:// URL']);
      return;
    }

    const targetRow = firstDataRow + index;
    try {
      // Replace this URL and parameters with your provider's documented API.
      const response = UrlFetchApp.fetch('https://YOUR_PROVIDER_ENDPOINT', {
        method: 'get',
        headers: { Authorization: 'Bearer ' + apiKey },
        // Provider-specific fields go here. This is not a universal API schema.
        payload: { url: url },
        muteHttpExceptions: true
      });

      const code = response.getResponseCode();
      if (code < 200 || code >= 300) {
        throw new Error('Screenshot API returned HTTP ' + code);
      }

      const blob = response.getBlob().setName('screenshot-' + targetRow + '.png');
      // Google documents a 2 MB maximum supported Blob size for this method.
      sheet.insertImage(blob, 3, targetRow);
      statuses.push(['Captured']);
    } catch (error) {
      statuses.push(['Failed: ' + error.message]);
    }
  });

  // Write statuses together instead of making a sheet call for each row.
  sheet.getRange(firstDataRow, 2, statuses.length, 1).setValues(statuses);
}

The placeholder endpoint and parameter object are deliberately not presented as a working provider request. Some APIs use query parameters, some use a POST body, and their authentication and response types vary. For a GET request, encode parameters according to the provider’s instructions instead of assuming that a request body is accepted.

Free tools Windows power users keep installed

One-click scans. No signup required.

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

If the API returns a hosted image URL instead of image bytes, use the URL insertion method only when that image URL is publicly accessible. Google’s Sheet documentation covers URL-based image insertion and image Blob insertion; it states a maximum supported Blob size of 2 MB for insertImage(blobSource, ...). Larger images may need resizing or a different storage and display approach.

Rank #2
Philips 22 Inch Computer Monitor FHD 100Hz VA VESA Flicker-Free, 221V8LB
  • CRISP CLARITY: This 22 inch class (21.5″ viewable) Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
  • 100HZ FAST REFRESH RATE: 100Hz brings your favorite movies and video games to life. Stream, binge, and play effortlessly
  • SMOOTH ACTION WITH ADAPTIVE-SYNC: Adaptive-Sync technology ensures fluid action sequences and rapid response time. Every frame will be rendered smoothly with crystal clarity and without stutter
  • INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
  • THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors

To avoid repeated captures when rerunning the script, add a condition that skips rows already marked “Captured,” or track completion in a dedicated column. If you want a recapture, clear that status deliberately. For extensive jobs, process a limited range per execution rather than assuming the full list will fit in one run.

Choose how captures start

Run on demand from a menu

A custom menu is a good fit when someone reviews URLs and chooses when to capture them. Apps Script can add a menu when the spreadsheet opens and connect a menu item to the capture function. The function can use authorized services and write images and statuses to other cells.

Run on a schedule

Use an installable time-driven trigger for recurring captures. In Apps Script, open Triggers (the clock icon), choose Add Trigger, select the capture function, and select a time-driven event and interval. Google may randomize the exact execution time within the selected period, so a recurring trigger should not be treated as a precise clock alarm.

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

An installable trigger runs under the account that created it. That account’s authorization and quotas therefore matter. Triggers created by another person are not necessarily visible in your own trigger list, which is important for shared-sheet ownership and maintenance.

Rank #3
Sale
Dell 24 Monitor - SE2426H - 23.8-inch FHD (1920x1080) 144Hz 1ms Display, in-Plane Switching (IPS) Technology, AMD FreeSync™, TÜV 3-Star 2X HDMI, Tilt
  • Clear visuals. Fluid motion: A 144Hz refresh rate and 1ms MPRT deliver smooth, tear‑free motion across work, gaming, and streaming for clearer, more fluid viewing.
  • Eye comfort: TÜV Rheinland 3‑star* certification reduces harmful blue light while preserving stunning color quality without compromise. *TÜV Rheinland 3-star eye comfort certification.
  • Wide viewing angle: Get consistent views across a wide 178° /178° viewing angle.
  • In-Plane Switching (IPS): See excellent color accuracy and consistency across wide viewing angles with In-plane Switching (IPS) technology.
  • Ultra-thin bezels: Maximize your viewing experience with thin bezels.

React to human edits

An installable edit trigger can respond when a person enters or changes a URL. Simple triggers have restrictions on services that require authorization, so use an installable trigger if the action needs external requests. Also note that edits made by a script or API do not themselves activate an edit trigger. If another script populates URL rows, have it call the capture function directly or arrange a separate scheduled run.

Why a cell formula is usually the wrong tool

A custom formula such as =SCREENSHOT(A2) is not a general-purpose job runner. Custom functions must return a value to their cell, cannot edit arbitrary cells, may not be able to call services requiring authorization, and must finish within 30 seconds. Google recommends a custom menu for operations that need to use authorized services or change other cells. See Custom Functions in Google Sheets.

Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server. It can return an image or PDF, and its request parameters are compatible with names used by other screenshot APIs to make switching easier. Here is a direct cURL request that saves a WebP screenshot:

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.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Replace the example URL with the page you want to capture and use your API key. See the ScreenshotNeo API documentation for request options and response details. Its cleanup steps accept cookie and consent banners like a visitor and remove more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and responses identify the page verdict and billing status in headers. ScreenshotNeo also has an MCP server with take_screenshot, get_page_info, and capture_pdf tools for AI agents using Claude, Cursor, or another MCP client.

The Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots. Sign up free for ScreenshotNeo.

Rank #4
Samsung 27" Essential S3 (S36GD) Series FHD 1800R Curved Computer Monitor
  • CURVED FOR ENHANCED ENGAGEMENT: An immersive viewing experience with a curved monitor that wraps more closely around your field of vision; It creates a wider view, enhancing depth perception and minimizing peripheral distraction
  • SMOOTH PERFORMANCE FOR SEAMLESS CONTENT: Stay in the action when playing games, watching videos, or working on creative projects; The 100Hz refresh rate reduces lag and motion blur so you don't miss a thing in fast-paced moments¹
  • MORE GAMING POWER: Gain the edge with optimizable game settings; Color and image contrast can be adjusted to see scenes more vividly and spot enemies hiding in the dark; Game Mode adjusts any game to fill the screen so you can view every detail²
  • KEEP IT EASY ON THE EYES: Care for your eyes and stay comfortable, even during long sessions; Advanced eye comfort technology certified by TÜV reduces eye strain by minimizing blue light and reducing irritating screen flicker²
  • INCREASED VERSATILITY: Connect to more; Plug devices straight into your monitor for increased flexibility, making your computing environment even more convenient

Improve throughput without making the workflow fragile

  • Batch sheet reads and writes. Read the URL range once and write statuses in a range, as in the example. Google recommends minimizing service calls and using batch operations.
  • Chunk large lists. Limit each run to a manageable set of rows and record progress so another run can continue. The workable chunk size depends on API latency, provider limits, Apps Script execution limits, and account quotas.
  • Handle failures per row. Catch errors around each capture so one bad URL does not prevent later rows from being attempted. Preserve a useful status or error message for retry decisions.
  • Consider workload fit. Apps Script quotas vary by account type and are per user; Google says quotas reset 24 hours after the first request. For very large or high-frequency workloads, Google’s best-practices guidance recommends considering a dedicated database rather than treating a spreadsheet as a job-processing system.

These limits do not imply a fixed maximum number of screenshots per run. The API’s latency, request limits, script runtime, and the account’s quotas all influence throughput. Check current limits in Google’s Apps Script quotas and the selected provider’s documentation.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Troubleshoot common problems

The request returns an HTTP error

Check the provider’s current endpoint, required HTTP method, API key, and parameter names. A 401 or 403 commonly indicates an authentication or permission problem; a 400 usually points to a malformed or incomplete request. Inspect the response body when the provider supplies a useful error message, and do not print secrets into logs or status cells.

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

The API responds, but the image is not inserted

Confirm that the response is actually image bytes and that its content type matches an image. If the provider returns JSON containing a URL, parse that response and insert the URL only if it is publicly accessible. If the image Blob exceeds Google’s documented 2 MB supported size for image insertion, request a smaller capture or resize it before inserting.

The inserted image is inaccessible or missing later

For URL insertion, verify that the link is publicly reachable by Sheets and that the provider does not require a browser session or private authorization to fetch it. Check how long the provider retains hosted images; retention is provider-specific. If using bytes, insert the Blob returned by the fetch instead of a temporary, inaccessible URL.

Best Value
Sale
Sceptre New 22-Inch Gaming Monitor, FHD 1080p, Up to 144Hz, HDMI, DisplayPort, Built-in Speakers, Machine Black (E225W-FW144 Series, 2026)
  • 【INTEGRATED SPEAKERS】Whether you're at work or in the midst of an intense gaming session, our built-in speakers provide rich and seamless audio, all while keeping your desk clutter-free.
  • 【EASY ON THE EYES】 Protect your eyes and enhance your comfort with Blue-Light Shift technology. This feature reduces harmful blue light emissions from your screen, helping to alleviate eye strain during long hours of use and promoting healthier viewing habits.
  • 【WIDEN YOUR PERSPECTIVE】Our sleek minimal bezel design ensures undivided attention. The nearly bezel-free display seamlessly connects in a dual monitor arrangement, delivering an unobstructed view that lets you focus on more at once, completely distraction-free.

Only some rows complete

Check each row’s status and the execution log for the failed URL and response. Invalid URLs, redirects, pages requiring login, API throttling, slow page loads, and transient network failures can affect individual captures. Add a retry policy only for errors that are plausibly transient, and set a maximum attempt count so a persistent failure does not loop indefinitely.

The trigger does not fire as expected

Verify that an installable trigger exists for the correct function and that its creator has authorized the required services. Time-driven triggers are not guaranteed to run at an exact minute. An edit trigger will not be activated by script/API changes, so call the capture routine directly when another automation adds rows.

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

The script stops before processing the whole list

Reduce the number of URLs handled in each run, save progress, and resume in a later run or trigger. Minimize per-row spreadsheet calls, monitor execution time, and check quotas for the account that runs the script. A custom function is especially unsuitable for batches because of its 30-second execution ceiling.

Checklist before automating a full spreadsheet

  • Use the provider’s documented request schema and authentication.
  • Decide whether to store image bytes in the sheet or insert a public image URL.
  • Test pages with redirects, login requirements, and the rendering behavior relevant to your use case.
  • Choose a manual menu, time-driven trigger, or human-edit trigger that matches how rows are added.
  • Set clear statuses, record failures, and make retries deliberate.
  • Chunk the work and verify current Apps Script quotas and screenshot API limits.
  • Identify the account that owns the trigger, credentials, and ongoing maintenance.

Frequently Asked Questions

Can Google Sheets take a screenshot of a web page without an API?

Not through the Apps Script workflow described here. The page must be rendered by a screenshot service or another browser-rendering system; Sheets stores or displays the resulting image.

Can I put the screenshot directly inside a cell?

The Apps Script image insertion methods place an image over the sheet grid rather than storing it as ordinary cell text. You can keep a screenshot URL in a cell, or insert an image at a row and column.

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.

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