Use Google Sheets to hold the URLs and Apps Script to manage the work, but use a separate browser-rendering service to capture each page. A reliable workflow reads URLs in bounded batches, sends screenshot requests with UrlFetchApp.fetchAll(), records a status and output for each row, and resumes unfinished work on a later run. Apps Script makes the HTTP requests; it does not render webpages itself.
Choose what the sheet should store
Before writing the script, decide how people will use the results. The screenshot service may return image bytes or a URL, and the output choice affects how you store and display each capture.
As an Amazon Associate I earn from qualifying purchases.
- Screenshot URL: Record the returned link in the sheet. This is simple, but confirm the link’s access and retention rules with your renderer.
- Drive file: Save returned image bytes as a file in Google Drive and record its link. This provides a Drive reference; sharing and retention depend on your Drive settings and the renderer’s response.
- Image in the grid: Insert or display the capture within the sheet. Google Sheets offers different image mechanisms, and they do not behave identically in every implementation. Test the chosen method with the renderer’s actual output before processing a large list. Spreadsheet.dev discusses image options in Sheets.
The example below expects a screenshot service that accepts a URL and returns an image response. It saves that image to Drive and writes the Drive URL in the sheet. If your provider returns a hosted image URL instead, adapt the response handling to record that URL rather than treating it as image bytes.
Set up the spreadsheet and Apps Script
Prepare the sheet
Create a sheet named Screenshots with these headers in row 1:
#1 Best Overall
- PORTABLE SCANNER FOR USE ON-THE-GO — The fastest and lightest mobile single-sheet-fed compact document scanner in its class¹
- QUICK DOCUMENT SCANNING ― This Epson ultra-fast scanner scans a single page as quickly as 5.5 seconds²; Windows and Mac compatible
- VERSATILE PAPER HANDLING ― Portable scanner scans documents up to 8.5 x 72 in; Also easily digitizes receipts and ID cards to make accounting, bookkeeping, and organizing simpler
- INTUITIVE, HIGH-SPEED SOFTWARE — Epson ScanSmart Software³ is a smart tool allowing you to easily scan, review, and save; Stay organized easily with the help of this Epson scanner
- EASY SETUP — USB-powered connect to your computer for quick and simple scanning; No batteries or external power supply required to operate portable document scanner; Standard Connectivity: USB 2.0
| Column | Header | Purpose |
|---|---|---|
| A | URL | Page to capture; use one URL per row. |
| B | Status | pending, complete, or error. |
| C | Screenshot | Drive file URL for a successful image. |
| D | Error | Failure detail, if available. |
Enter URLs below the header. Set each new row’s status to pending, or leave the status blank; the script treats blank status as pending. Create a Drive folder for the captures and copy its folder ID from the folder URL.
Configure the script
- In the spreadsheet, open Extensions → Apps Script to create a bound script project.
- Replace the editor contents with the code below. Change
API_ENDPOINT,API_KEY, andDRIVE_FOLDER_IDfor your screenshot provider and Drive folder. - Save the project. Run
processScreenshotBatchonce from the Apps Script editor and approve the requested spreadsheet, Drive, and external-request permissions.
Google describes UrlFetchApp as a service for fetching URLs to communicate with other applications or access web resources. It transports the request; the separate renderer captures the page in a browser. If you explicitly configure OAuth scopes in the project manifest, include https://www.googleapis.com/auth/script.external_request for URL Fetch. Google for Developers: Class UrlFetchApp.
Rank #2
- FAST SPEEDS - Scans color and black and white documents a blazing speed up to 16ppm (1). Color scanning won’t slow you down as the color scan speed is the same as the black and white scan speed.
- ULTRA COMPACT – At less than 1 foot in length and only about 1. 5lbs in weight you can fit this device virtually anywhere (a bag, a purse, even a pocket).
- READY WHENEVER YOU ARE – The DS-640 mobile scanner is powered via an included micro USB 3. 0 cable allowing you to use it even where there is no outlet available. Plug it into you PC or laptop and you are ready to scan.
- WORKS YOUR WAY – Use the Brother free iPrint&Scan desktop app for scanning to multiple “Scan-to” destinations like PC, Network, cloud services, Email and OCR. (2) Supports Windows, Mac and Linux and TWAIN/WIA for PC/ICA for Mac/SANE drivers. (3)
- OPTIMIZE IMAGES AND TEXT – Automatic color detection/adjustment, image rotation (PC only), bleed through prevention/background removal, text enhancement, color drop to enhance scans. Software suite includes document management and OCR software. (4)
Runnable batch script for an image-returning renderer
This example processes at most 20 pending rows per run, saves successful image responses into Drive, and records each row’s result. It uses fetchAll() for grouped HTTP requests and handles responses individually. The endpoint, authentication header, and screenshot parameters are provider-specific: replace the marked request construction with the format required by your renderer.
const SHEET_NAME = 'Screenshots';
const API_ENDPOINT = 'https://YOUR-RENDERER-ENDPOINT';
const API_KEY = 'YOUR_API_KEY';
const DRIVE_FOLDER_ID = 'YOUR_DRIVE_FOLDER_ID';
const BATCH_SIZE = 20;
function processScreenshotBatch() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
if (!sheet) throw new Error(`Sheet not found: ${SHEET_NAME}`);
const lastRow = sheet.getLastRow();
if (lastRow < 2) return;
const rows = sheet.getRange(2, 1, lastRow - 1, 4).getValues();
const pending = [];
for (let i = 0; i < rows.length && pending.length < BATCH_SIZE; i++) {
const url = String(rows[i][0] || '').trim();
const status = String(rows[i][1] || '').trim().toLowerCase();
if (url && (!status || status === 'pending' || status === 'error')) {
pending.push({ rowNumber: i + 2, url });
}
}
if (pending.length === 0) return;
const requests = pending.map(item => ({
url: API_ENDPOINT + '?url=' + encodeURIComponent(item.url),
method: 'get',
headers: { Authorization: 'Bearer ' + API_KEY },
muteHttpExceptions: true
}));
let responses;
try {
responses = UrlFetchApp.fetchAll(requests);
} catch (err) {
pending.forEach(item => writeFailure(sheet, item.rowNumber, String(err)));
return;
}
const folder = DriveApp.getFolderById(DRIVE_FOLDER_ID);
responses.forEach((response, i) => {
const item = pending[i];
const code = response.getResponseCode();
const contentType = response.getHeaders()['Content-Type'] || '';
if (code < 200 || code >= 300) {
writeFailure(sheet, item.rowNumber, `Renderer returned HTTP ${code}: ${response.getContentText().slice(0, 500)}`);
return;
}
if (!contentType.toLowerCase().startsWith('image/')) {
writeFailure(sheet, item.rowNumber, `Expected image response; received ${contentType || 'unknown content type'}`);
return;
}
try {
const extension = contentType.toLowerCase().includes('png') ? 'png'
: contentType.toLowerCase().includes('jpeg') ? 'jpg' : 'webp';
const safeName = item.url.replace(/[^a-z0-9]+/gi, '-').slice(0, 60) || 'page';
const file = folder.createFile(response.getBlob().setName(`${safeName}-${Date.now()}.${extension}`));
sheet.getRange(item.rowNumber, 2, 1, 3)
.setValues([['complete', file.getUrl(), '']]);
} catch (err) {
writeFailure(sheet, item.rowNumber, String(err));
}
});
}
function writeFailure(sheet, rowNumber, message) {
sheet.getRange(rowNumber, 2, 1, 3)
.setValues([['error', '', message.slice(0, 1000)]]);
}
The sample treats rows marked error as eligible to retry on the next run. If you want to retry only after manual review, remove || status === 'error' from the eligibility condition. For a hosted-URL response, validate the response body and write the renderer’s returned URL to column C rather than calling createFile().
Rank #3
- FAST DOCUMENT SCANNING — Document scanner with feeder allows you to speed through stacks with a 50-sheet Auto Document Feeder (ADF); Efficient office scanner to help you scan more productively
- INTUITIVE, HIGH-SPEED SOFTWARE — Quickly scan with this desktop document scanner; Epson ScanSmart Software lets you easily preview scans, email files, upload to the cloud, and more; Plus, automatic file naming saves even more time
- SEAMLESS INTEGRATION — Easily incorporate your data into most document management software with the included TWAIN driver; Office document scanner integrates seamlessly with business workflows
- EASY SHARING — Duplex scanner allows you to scan straight to email or popular cloud storage2 services like Dropbox, Evernote, Google Drive, and OneDrive for simple storage and sharing
- SIMPLE FILE MANAGEMENT — Scanner allows the creation of searchable PDFs with Optical Character Recognition (OCR) and convert scans to editable Word or Excel files effortlessly; Designed for home and office document scanning
Run the workflow in resumable batches
- Paste the page URLs into column A and mark rows
pending. - Run
processScreenshotBatch. It selects up to 20 pending or error rows, makes the requests, and writes a result for each. - Check columns B–D. Fix invalid URLs, permissions, or provider-specific errors, then rerun to process the next batch or retry errors.
- Continue until no pending rows remain. Keep each run bounded instead of assuming one execution will finish an arbitrarily large list.
Google documents that fetchAll() accepts an array of URLs or request objects and returns an array of HTTP responses. Grouping requests saves repeated method calls, but it does not remove provider rate limits, execution ceilings, or individual request failures. Google for Developers: fetchAll().
Choose a renderer and request format
Apps Script is the coordinator, not the screenshot engine. Choose a browser-rendering service that accepts the kind of URLs you need and returns either image bytes or a usable image URL. Before relying on it, check its authentication method, supported viewport and full-page options, output format, rate limits, batch behavior, retention, pricing, and terms for your target sites. Those details vary by provider and are not universal.
Rank #4
- Scanner type: Document
- Connectivity technology: USB
- With Auto Scan Mode, the scanner automatically detects what you're scanning
- Digitize documents and images
ScreenshotNeo is a browser screenshot API and MCP server for developers. It accepts a URL and can return a PNG, JPEG, WebP, or PDF; its API also accepts parameter names used by other screenshot APIs to make switching easier. See ScreenshotNeo and its API documentation for its request parameters. Its GET endpoint returns an image or PDF response, so use a response-handling branch suited to the requested output rather than assuming every request is an image.
Recommended Free Tools
Or skip the browser setup
With ScreenshotNeo, one GET request can return a screenshot. In the Apps Script workflow, send a request to its endpoint using the same grouped-request pattern and store the returned image bytes or PDF as appropriate. The following standalone cURL call saves a WebP screenshot; replace the sample URL and use your API key.
Best Value
- OUR MOST ADVANCED SCANSNAP. Large touchscreen, fast 45ppm double-sided scanning, 100-sheet document feeder, Wi-Fi and USB connectivity, automatic optimizations, and support for cloud services. Upgraded replacement for the discontinued iX1600
- CUSTOMIZABLE. SHARABLE. Select personalized profiles from the touchscreen. Send to PC, Mac, mobile devices, and clouds. QUICK MENU lets you quickly scan-drag-drop to your favorite computer apps
- STABLE WIRELESS OR USB CONNECTION. Built-in Wi-Fi 6 for the fastest and most secure scanning. Connect to smart devices or cloud services without a computer. USB-C connection also available
- PHOTO AND DOCUMENT ORGANIZATION MADE EFFORTLESS. Easily manage, edit, and use scanned data from documents, receipts, photos, and business cards. Automatically optimize, name, and sort files
- AVOIDS PAPER JAMS AND DAMAGE. Features a brake roller system to feed paper smoothly, a multi-feed sensor that detects pages stuck together, and skew detection to prevent paper damage and data loss
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
ScreenshotNeo removes cookie and consent banners, newsletter popups, and chat widgets before capture; each cleanup step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and responses indicate the page verdict and billing status in headers. Its MCP server provides screenshot tools for Claude, Cursor, and other MCP clients. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots.
Sign up for ScreenshotNeo’s free plan.
Runtime, quotas, and cost controls
Google’s Apps Script quota documentation, accessed October 3, 2026, lists a six-minute runtime per execution and daily URL Fetch quotas of 20,000 calls for consumer accounts and 100,000 for Google Workspace accounts. Google says these quotas are per user, reset 24 hours after the first request, and can change without notice. Check the current limits for the account running the script; they are ceilings, not recommended batch sizes. Google Apps Script quotas.
- Set a conservative batch size: Rendering time varies by page and provider. Start small, inspect execution duration, and adjust without approaching the six-minute ceiling.
- Count both sides: A batch makes URL Fetch calls from Apps Script, while the renderer may apply separate request or concurrency limits and charges.
- Avoid duplicate captures: Completed rows are skipped. Clear or change the status deliberately when a new capture is needed.
- Keep state in the sheet: Row-level statuses make it possible to resume after execution limits or isolated errors without starting from the beginning.
Troubleshoot common failures
| Symptom | Likely cause | What to check |
|---|---|---|
| “Sheet not found” error | The tab name differs from SHEET_NAME. |
Use the exact sheet tab name or update the constant. |
| HTTP 401 or 403 from renderer | Missing or invalid credentials, or the account lacks access. | Check the provider’s authentication format, key validity, and service permissions. |
| HTTP 400 response | The URL or screenshot parameters are invalid or encoded incorrectly. | Inspect the renderer’s error body and confirm its documented parameter names and URL format. |
| HTTP 429 response or intermittent failures | The renderer is throttling requests or has a concurrency limit. | Reduce BATCH_SIZE, add a delay or retry strategy appropriate to the provider, and respect its rate limits. |
| “Expected image response” error | The renderer returned JSON, HTML, a PDF, or another non-image response. | Check the output format requested and adapt the script to parse the returned content rather than saving it as an image. |
| Drive permission error | The executing Google account cannot access the configured folder. | Confirm the folder ID and ensure the account running the script has permission to create files there. |
| Execution timed out | The batch took longer than Apps Script’s execution limit. | Lower the batch size and process more runs; do not treat a single execution as the entire job. |
| Image link does not display to collaborators | The file’s Drive access settings may not permit those viewers to open it. | Review Drive sharing policy or use the renderer’s supported public or signed URL method. |
| The sheet appears to have missing images | The chosen display method may not support the renderer’s output or access model. | Test image insertion or display with the actual response and confirm that viewers can access its source. |
FAQ
Does Apps Script itself take the webpage screenshot?
No. UrlFetchApp sends HTTP requests; a separate browser-based renderer must load and capture the webpage.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Can I put screenshots directly in cells?
Yes, but the right Sheets image method depends on whether you have image bytes, a stable URL, or a Drive file and on who needs to view it. Test your chosen method with the renderer’s real response.
Can one script process a very large URL list?
It can process the list across multiple bounded executions. The script’s batch size and the renderer’s limits should be chosen so that a run can finish and leave clear row-level state for resuming.
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.




