You can schedule an Apps Script to run daily and log website data in Google Sheets. But UrlFetchApp retrieves an HTTP response; it does not render a webpage as a browser screenshot. For a visual capture, use a browser-rendering method that returns an image, then insert that image into the sheet. Google’s documented building blocks cover scheduling, fetching, and inserting images—not a built-in webpage screenshot renderer.
First decide what you mean by “screenshot”
If you want a daily record of page text, status codes, or other response data, Apps Script can make an HTTP request and write the result to a sheet. If you need a picture of the page as a visitor sees it—including layout and content rendered by JavaScript—you need a separate browser-rendering or screenshot method. The Google documentation cited here does not establish a specific renderer or provider.
As an Amazon Associate I earn from qualifying purchases.
- HTTP/data log: Apps Script’s
UrlFetchAppcan request HTTP or HTTPS resources and receive responses. That is not equivalent to rendering the page in a browser. See Google’s URL Fetch Service reference. - Visual image: Sheets can insert an image from a blob, or from a publicly accessible image URL. Insertion places an existing image in the sheet; it does not create one. See Google’s Spreadsheet reference.
What the daily workflow looks like
- Choose the target URL and decide whether you need response data or a rendered visual image.
- Create an Apps Script function that writes a timestamp and result to a spreadsheet. For a visual capture, the function also needs to obtain a valid image blob or an eligible public image URL from a rendering method.
- Authorize the script to use the services it needs.
- Install a time-driven trigger to run the function daily.
- Review executions and record or handle failed requests and missing images.
Apps Script is edited in a browser-based editor, stored in Drive, and runs on Google’s servers; this workflow does not require a dedicated physical computer to stay on. See Google’s Apps Script overview.
Recommended Free Tools
Create a sheet logger in Apps Script
The following example records an HTTP response status and a short excerpt of its body. It is a data log, not a screenshot. Create a spreadsheet, open Extensions → Apps Script, paste the code, and replace the spreadsheet ID and target URL.
#1 Best Overall
const SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID';
const TARGET_URL = 'https://example.com';
function logWebsiteResponse() {
const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheets()[0];
const timestamp = new Date();
try {
const response = UrlFetchApp.fetch(TARGET_URL, {
followRedirects: true,
muteHttpExceptions: true
});
const status = response.getResponseCode();
const excerpt = response.getContentText().slice(0, 500);
sheet.appendRow([timestamp, TARGET_URL, status, excerpt]);
} catch (error) {
sheet.appendRow([timestamp, TARGET_URL, 'FETCH_ERROR', String(error)]);
throw error;
}
}
The example deliberately captures the response status and text rather than claiming to capture the page’s visual appearance. If your Apps Script project declares OAuth scopes explicitly, include the script.external_request scope for URL Fetch requests, as described in the URL Fetch Service reference.
Install a daily trigger
Use an installable time-driven trigger rather than a simple trigger. Simple triggers are event-based, have authorization restrictions, and have a 30-second maximum execution time; time-driven triggers are installable triggers. See Google’s trigger guide.
Rank #2
- Intuitive interface of a conventional FTP client
- Easy and Reliable FTP Site Maintenance.
- FTP Automation and Synchronization
- In the Apps Script editor, select the clock-shaped Triggers icon in the left sidebar.
- Choose Add Trigger.
- Set the function to
logWebsiteResponse. - For the event source, choose Time-driven.
- Choose a daily timer and select a time window that suits your workflow.
- Save the trigger and complete the authorization prompts.
Daily does not mean an exact wall-clock minute. Google says a recurring 9 a.m. trigger may be assigned a time between 9 and 10 a.m.; the selected timing then stays consistent from day to day so 24 hours elapse between runs. See Installable Triggers.
Insert a rendered image only when you have one
For a real visual screenshot, the capture step must provide image data as a blob or a publicly accessible image URL. Once you have an image blob, Sheets supports insertion with insertImage(blobSource, column, row). The documented method supports blobs up to 2 MB. A URL used for insertion must be publicly accessible; a private image URL may not work with that method. These are image-insertion constraints, not screenshot-generation capabilities. See Google’s Spreadsheet reference.
Rank #3
// imageBlob must already contain a valid image produced by your chosen capture method.
const sheet = SpreadsheetApp.openById('YOUR_SPREADSHEET_ID').getSheets()[0];
sheet.insertImage(imageBlob, 1, 2);
Do not substitute the target webpage URL for imageBlob: a webpage is not an image file. Similarly, only use URL-based insertion when you have a direct, publicly accessible image URL.
Or skip the browser setup
ScreenshotNeo is a website screenshot API and MCP server. Its one-call API can return a screenshot; put the result in a scheduled workflow if you want to archive images in Sheets. See the ScreenshotNeo API documentation for request options and response handling.
Rank #4
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
ScreenshotNeo can accept cookie or consent banners and remove known consent platforms, newsletter popups, and chat widgets before capture; each of those steps can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and responses identify the page verdict and billing status. Its MCP server offers screenshot and PDF tools to AI agents. The free plan includes 1,000 screenshots per month without a card; paid plans start at $5 for 3,000. Sign up for 1,000 free screenshots a month, with no card required.
Troubleshoot common problems
- The sheet contains HTML or text, not a picture:
UrlFetchAppfetched an HTTP response. Use a browser-rendering capture method that returns image data, then insert that image. - The image URL cannot be inserted: Confirm it is a direct image URL accessible publicly without a login or private session. Alternatively, obtain an image blob from the capture step and use blob-based insertion.
- The blob insertion fails or exceeds the supported size: Check that the value is a valid image blob and that it is within the documented 2 MB maximum for
insertImage(blobSource, column, row). - The trigger does not run at the exact selected minute: Time-driven scheduling may assign a time within the selected window. Check the Apps Script execution history and plan for a recurring window rather than exact-minute timing.
- URL Fetch reports an authorization or scope problem: Run the function manually to authorize it. If the project lists scopes explicitly, include
script.external_request. - The function fails after being configured as a simple trigger: Configure an installable time-driven trigger instead; simple triggers have authorization limits and a 30-second maximum execution time.
Reliability and operating notes
A daily trigger schedules attempts; it does not make the target website, network request, or external renderer infallible. Keep a timestamp and status in the sheet so a missing image can be distinguished from a run that never occurred. The official sources cited here establish the trigger behavior and image-insertion constraints, but do not establish a specific screenshot service’s quotas, reliability, or cost; check the chosen renderer’s documentation for those details.
Quick Recap
Best Value
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.




