Put one URL per row in Google Sheets, then use a bound Google Apps Script to send each URL to a browser-based screenshot API and record the result. Apps Script can read and update the sheet and make HTTP requests; the screenshot service—not UrlFetchApp—must render the web page in a browser and produce the image.
What you need to set up
- A Google Sheet with one website URL per row in a designated column.
- A screenshot API that documents its current endpoint, authentication, output format and usage limits. The example below uses ScreenshotNeo’s API.
- A destination for results. The script below inserts each returned image into the sheet and records a status beside its source row.
Google documents UrlFetchApp as a service for making external HTTP and HTTPS requests. Its fetchAll(requests) method can make multiple requests, but it does not turn a request into a browser screenshot. A rendering service is responsible for loading the page and capturing it. Google’s documentation lists the external-request authorization scope as https://www.googleapis.com/auth/script.external_request; Apps Script will prompt you to authorize the script when it first runs.
Prepare the spreadsheet
- Keep a header row in row 1. Put URLs in column A, beginning in A2.
- Reserve column B for the screenshot image and column C for the status or error message. Change the column numbers in the script if your layout differs.
- Open the spreadsheet’s bound Apps Script project using Extensions > Apps Script.
- Store your ScreenshotNeo access key in the project’s Script Properties rather than in a sheet cell or source code. In Apps Script, open Project Settings, find Script Properties, and add a property named
SCREENSHOTNEO_ACCESS_KEYwith your key as its value. Restrict access to the script project: people who can edit it may be able to access its configuration or run code using the credential.
Run this Google Apps Script
This example processes a small group of rows per run, keeps each result beside its original URL, and records an error on the matching row instead of letting failures shift later results. It inserts image bytes into the sheet; Google documents a 2 MB maximum supported blob size for blob-based image insertion. If an image is larger, the script records the insertion error in column C. Run it again to continue with rows that do not already have a status.
function screenshotUrlRows() {
const SHEET_NAME = 'Sheet1';
const URL_COLUMN = 1; // A
const IMAGE_COLUMN = 2; // B
const STATUS_COLUMN = 3; // C
const FIRST_DATA_ROW = 2;
const ROWS_PER_RUN = 10; // Keep batches modest; adjust after checking current limits.
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
if (!sheet) throw new Error('Sheet not found: ' + SHEET_NAME);
const key = PropertiesService.getScriptProperties()
.getProperty('SCREENSHOTNEO_ACCESS_KEY');
if (!key) throw new Error('Add SCREENSHOTNEO_ACCESS_KEY in Script Properties.');
const lastRow = sheet.getLastRow();
if (lastRow < FIRST_DATA_ROW) return;
const count = lastRow - FIRST_DATA_ROW + 1;
const urls = sheet.getRange(FIRST_DATA_ROW, URL_COLUMN, count, 1).getValues();
const statuses = sheet.getRange(FIRST_DATA_ROW, STATUS_COLUMN, count, 1).getValues();
let processed = 0;
for (let i = 0; i < urls.length && processed < ROWS_PER_RUN; i++) {
const row = FIRST_DATA_ROW + i;
const url = String(urls[i][0] || '').trim();
const existingStatus = String(statuses[i][0] || '').trim();
if (!url || existingStatus) continue;
processed++;
try {
const response = UrlFetchApp.fetch('https://api.screenshotneo.com/v1/shot', {
method: 'get',
payload: { access_key: key, url: url },
muteHttpExceptions: true
});
const code = response.getResponseCode();
if (code < 200 || code >= 300) {
throw new Error('Screenshot API returned HTTP ' + code + ': ' + response.getContentText().slice(0, 300));
}
const blob = response.getBlob().setName('screenshot-row-' + row + '.png');
sheet.insertImage(blob, IMAGE_COLUMN, row);
sheet.getRange(row, STATUS_COLUMN).setValue('Inserted');
} catch (err) {
sheet.getRange(row, STATUS_COLUMN).setValue('Error: ' + String(err.message || err).slice(0, 450));
}
}
}
Apps Script’s UrlFetchApp.fetch() accepts request parameters, including a payload for GET requests; the service serializes the payload as query parameters. Check your screenshot provider’s current instructions if its authentication or request format changes. The example requests the endpoint’s default image response and does not set capture options.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →#1 Best Overall
- Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
- Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
- Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
- Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
- 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
Choose whether to insert images or keep links
Insert images in the grid
The script inserts the returned image blob anchored at the corresponding row. This is useful when you need to scan results without opening separate files, but many inserted images can make a sheet cumbersome. The documented blob insertion size limit is 2 MB. Image placement is anchored to a cell rather than stored as ordinary cell text, so the status column is useful for tracking what happened.
Store or display screenshot links
If your screenshot service returns a hosted image URL, you can record that URL in a result column. Google’s documented URL-based insertImage(url, column, row) method requires the URL to be publicly accessible. Do not assume a returned link is permanent or public: check the provider’s current documentation for access control, retention and link lifetime. A link can be better than embedding many images, but its usefulness depends on how the provider hosts it.
Rank #2
- 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
- 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
- Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
- 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
- What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
Use image bytes only when appropriate
Blob insertion avoids a separate public image URL, but the documented 2 MB limit applies. If captures exceed that limit, prefer a provider-hosted link or another storage-and-link workflow rather than assuming Sheets will accept larger blobs.
Handle batches, failures and resuming
There is no universal safe batch size established for every combination of Apps Script limits and screenshot API quotas. The sample deliberately handles a modest number of rows per run and skips rows with an existing status. Increase the batch only after checking current Google Apps Script quotas and the chosen provider’s current limits. For larger lists, track pending, successful and failed rows explicitly, and resume only rows that still need work.
Free tools Windows power users keep installed
One-click scans. No signup required.
Rank #3
- Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
- Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
- Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
- Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
- What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
- Keep row identity stable: write the outcome to the same row as its input URL, even when a request fails.
- Do not silently retry every error: distinguish a transient timeout or service error from an invalid URL or an access-denied page before retrying.
- Inspect response semantics: a successful HTTP response does not necessarily mean the page rendered as expected. If the provider returns page-verdict or billing headers, use its current documentation to interpret them.
- Plan for execution limits: the script may stop if a run exceeds current Apps Script execution or request limits. Smaller batches and a resumable status column reduce the amount of work to repeat.
- Check concurrency: avoid starting overlapping runs against the same rows, which can insert duplicate images or overwrite status.
Test edge cases before running the full column
Run a few representative URLs first and inspect both the captured image and the row status. Include pages that redirect, require login, block automated traffic, load slowly, or contain unusually long content. Decide how your workflow should treat each case; do not presume every URL will produce a meaningful screenshot just because the request completed.
Troubleshooting
- Authorization prompt or permission error: approve the Apps Script external request permission when prompted. If the script is managed by an organization, its administrator may control available permissions.
- Missing-key error: add the exact
SCREENSHOTNEO_ACCESS_KEYproperty in the bound project’s Script Properties and confirm it has a non-empty value. - HTTP error from the API: inspect the status and response message recorded in column C. Check the key, URL, provider endpoint and current API instructions; do not treat every non-2xx response as a page-rendering failure.
- Image too large to insert: blob insertion supports blobs up to 2 MB according to Google’s documentation. Use a hosted link where suitable or change the output strategy.
- Image is missing although status says inserted: check whether an image is anchored over the intended cell and whether the sheet’s layout or row height makes it hard to see. The script writes an over-cell image, not a formula into column B.
- Some rows never run: blank URLs and rows with any existing status are skipped. Clear the status cell for a row you want to retry, after checking that a previous image is not already present.
- Run ends before the column is complete: check current Apps Script limits and provider quotas. Run the function again; it skips rows already marked and continues with the next unmarked URLs.
Or skip the browser setup
ScreenshotNeo is a website screenshot API and MCP server for developers. Its API accepts a URL in one GET request and returns a screenshot or PDF. This cURL example saves a WebP screenshot:
Rank #4
- Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
- Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
- Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
- Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
- Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
For API parameters and integration details, see the ScreenshotNeo documentation. You can call the same endpoint from Apps Script using the request pattern above, then write the resulting image or an appropriate returned link to the matching row.
- Before capture, it accepts cookie or consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups and chat widgets; each step can be turned off.
- Bot checks and CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed. Responses indicate the page verdict and billing status in headers.
- Its MCP server offers
take_screenshot,get_page_infoandcapture_pdftools for AI agents and MCP clients. - The Free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000. All features are available on every plan.
Try ScreenshotNeo, or sign up free for 1,000 screenshots a month with no card.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Best Value
- 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
- Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
- Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
- HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
- What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
Frequently Asked Questions
Can Google Sheets take a browser screenshot by itself?
The workflow described here uses a screenshot renderer for browser capture; Apps Script handles the sheet and HTTP requests.
Can I safely use the same batch size for every spreadsheet and API?
No. Check current Apps Script limits and the selected provider’s quotas, then choose a modest batch that can resume.
Quick Recap
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.




