How to Set Up Daily Email Report in Google Sheets
Sending the same report from Google Sheets every morning can feel like a chore you’re sentenced to for life. You filter the data, copy-paste the summary into an email, check the recipient list, and hit send, only to do it all over again 24 hours later. This guide will show you how to set up a fully automated daily email report directly from Google Sheets, so you can set it once and let it run forever.
We'll walk through how to prepare your sheet, use a simple script to grab your data, and schedule it to email your team automatically every single day.
Why Bother Automating Reports in Google Sheets?
The daily reporting dance is familiar to most in marketing, sales, or operations. It often looks something like this: download a few CSVs, wrangle them in a spreadsheet, create a summary report, and then circulate it via email. By the time your team sees it and has follow-up questions, half the day is gone.
Automating this process directly within Google Sheets has some immediate, clear benefits:
- Save Time and Mental Energy: The most obvious benefit is reclaiming the 15-30 minutes you spend on this repetitive task every single day. That time adds up quickly, freeing you up to focus on analyzing the data, not just compiling it.
- Ensure Consistency: Automation removes the risk of human error. The report is sent in the same format, at the same time, every day, without fail. No more forgetting to send it on a busy Monday or making a copy-paste mistake.
- Deliver Timely Insights: When stakeholders get the key performance indicators (KPIs) in their inbox first thing in the morning, they can make informed decisions right away. The data is available when it’s most relevant, not hours later.
By transforming your Google Sheet from a static document into a dynamic reporting engine, you create a reliable, hands-off system for keeping everyone informed.
First, Prepare Your Google Sheet for Reporting
Before we touch a single line of code, the key to successful automation is a well-organized spreadsheet. Your script will be a lot simpler to create and manage if your data is structured logically.
The best practice is to separate your raw data from your report summary.
- Your Raw Data Tab: Have one sheet where all your raw data lives. This could be data you paste in manually, information pulled in via a tool like Zapier, or results from a Google Forms submission. Keep it organized with clear column headers. Let’s call this tab "RawData."
- Your Report Summary Tab: Create a second tab dedicated to the report you want to email. This sheet will pull summarized information from your "RawData" tab. This is the visual part that your team will see. Let’s name it "DailyReport."
In your "DailyReport" tab, build the small table or summary that contains the key numbers you want to share. You can use common spreadsheet formulas to pull the data you need from your master data sheet.
For example, if you have a "RawData" tab with sales transactions, your "DailyReport" tab might have a table that looks like this:
You could use formulas to calculate these values:
- For Today's Sales Revenue, you might use:
=SUMIF(RawData!A:A, TODAY(), RawData!C:C) - For New Customers Today, you might use:
=COUNTUNIQUEIFS(RawData!B:B, RawData!A:A, TODAY())
By creating a dedicated report tab, you can format it exactly how you want it to appear in the email, without worrying about messing up your source data.
Automate It All With Google Apps Script
Google Apps Script is the magic that makes this automation possible. It’s a coding platform built into Google Workspace that lets you programmatically control your spreadsheets, documents, and emails. You don't need to be a developer to use it, for this task, you'll just need to copy, paste, and lightly edit a pre-written script.
Step 1: Open the Script Editor
In your Google Sheet, navigate to Extensions > Apps Script. This will open a new tab with the script editor. It may look intimidating, but don't worry, we'll walk through it together.
Step 2: Give Your Project a Name and Paste the Script
At the top left, click on "Untitled project" and give it a helpful name like "Daily Email Reporting." Then, delete any placeholder code in the Code.gs window and paste the following script inside:
function sendDailyEmailReport() { // --- CUSTOM SETTINGS --- //
// Set the email address to send the report to. // To send to multiple people, separate addresses with a comma: 'email1@example.com,email2@example.com' var recipientEmail = "your.email@example.com",
// Set the subject line for the email. var emailSubject = "Daily Performance Report - " + new Date().toLocaleDateString(),
// Set the name of the sheet tab that has your report. var sheetName = "DailyReport",
// Set the range of cells you want to include in the email body. // For example, "A1:B5" to capture the first five rows in columns A and B. var rangeToEmail = "A1:B5",
// --- END OF CUSTOM SETTINGS, NO NEED TO EDIT BELOW --- //
var ss = SpreadsheetApp.getActiveSpreadsheet(), sheet = ss.getSheetByName(sheetName), range = sheet.getRange(rangeToEmail), data = range.getValues(),
var htmlTable = "<html><body>", htmlTable += "<h3>Here is your daily performance summary:</h3>", htmlTable += "<table border='1' cellpadding='5' cellspacing='0'>",
for (var i = 0, i < data.length, i++) { htmlTable += "<tr>", for (var j = 0, j < data[i].length, j++) { htmlTable += "<td>" + data[i][j] + "</td>", } htmlTable += "</tr>", }
htmlTable += "</table>", htmlTable += "<p><em>This is an automated report from Google Sheets.</em></p>", htmlTable += "</body></html>",
MailApp.sendEmail({ to: recipientEmail, subject: emailSubject, htmlBody: htmlTable }), }
Step 3: Customize the Script’s Settings
The only part of this script you need to edit is the "CUSTOM SETTINGS" section at the top. Here’s what each variable does:
- recipientEmail: Replace
"your.email@example.com"with the email address of the person you want to receive the report. To send it to multiple people, just list their emails inside the quotes, separated by a comma (e.g.,"ceo@company.com, headofsales@company.com"). - emailSubject: This is the subject line of the email. By default, it includes today's date to make it unique each day. You can change the text inside the quotes to whatever you like.
- sheetName: Make sure this matches the name of the tab you prepared for reporting. In our example, it's
"DailyReport". If your tab has a different name, update it here. - rangeToEmail: This is the most important part. Specify the exact range of cells you want to convert into an email table. For instance, if your report summary is in cells A1 through B5, you would set this to
"A1:B5".
Step 4: Save and Test the Script
Click the floppy disk icon (Save project) at the top of the editor. Then, to make sure it works, let’s run it manually once.
Select the sendDailyEmailReport function from the dropdown menu at the top and click the Run button. The first time you run it, Google will ask for your permission.
A window titled "Authorization required" will pop up. Click "Review permissions," choose your Google account, and click "Advanced." You may see a warning that Google hasn't verified this app—that's normal because you just wrote it. Click "Go to [Your Project Name] (unsafe)" and then "Allow" to grant the script permission to access your spreadsheet and send emails on your behalf.
Once you’ve granted permission, the script will execute. Check your inbox! You should receive an email containing a nicely formatted HTML table with the data from the range you specified.
Set It and Forget It: Schedule a Daily Trigger
Now for the final step: telling Google to run this script for you every morning automatically. We'll do this by setting up a "trigger."
- Open Triggers: In the Apps Script editor, look for a clock icon on the left-hand navigation bar and click it. This is the Triggers menu.
- Add a New Trigger: Click the "+ Add Trigger" button in the bottom right corner. A configuration window will pop up.
- Configure the Trigger: Set up the trigger with the following settings:
- Save: Click the "Save" button.
That's it! Your script is now live and will automatically send your report every single morning. You've officially automated one of your most repetitive daily tasks.
Bonus Tip: Send Report as PDF Attachment
Sometimes, an HTML table in the email body isn't enough. You might want to send a perfectly formatted PDF version of your report tab, complete with charts, colors, and specific layouts. This is also possible with a small script change! Replace the existing sendDailyEmailReport function with this modified version:
function sendPdfReport() { // --- CUSTOM SETTINGS --- // var recipientEmail = "your.email@example.com", emailSubject = "Daily Report PDF - " + new Date().toLocaleDateString(), sheetName = "DailyReport", // The sheet to convert to PDF emailBody = "Good morning! Please find the daily performance report attached as a PDF.", // --- END OF CUSTOM SETTINGS --- //
var ss = SpreadsheetApp.getActiveSpreadsheet(), sheet = ss.getSheetByName(sheetName), spreadSheetId = ss.getId(), sheetId = sheet.getSheetId(),
var url = "https://docs.google.com/spreadsheets/d/" + spreadSheetId + "/export?gid=" + sheetId + "&format=pdf" + "&size=letter" + // paper size "&portrait=true" + // orientation, true for portrait "&fitw=true" + // fit to width "&gridlines=false", // hide gridlines
var token = ScriptApp.getOAuthToken(), response = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' + token } }),
var blob = response.getBlob().setName(sheet.getName() + ".pdf"),
MailApp.sendEmail(recipientEmail, emailSubject, emailBody, { attachments: [blob] }), }
Remember to set up a new daily trigger for this sendPdfReport function if you want to use this method instead.
Final Thoughts
You've just learned how to turn a standard Google Sheet into an automated reporting tool using the power of Apps Script. This frees you from the daily grind of manual reporting, ensures your team gets information on time, and allows you to focus on the insights hidden in your data, not the process of gathering it.
While setting up automated reports in Google Sheets is a massive time-saver, things get complicated when your data is scattered across different platforms like Google Analytics, Shopify, Facebook Ads, and Salesforce. We built Graphed to solve exactly this problem. You connect all your sources in seconds, and then you can ask for dashboards and reports in plain English. No more piecing together data at all - just get the answers you need, live and in real-time, whenever you want.
Related Articles
What SEO Tools Work with Google Analytics?
Discover which SEO tools integrate seamlessly with Google Analytics to provide a comprehensive view of your site's performance. Optimize your SEO strategy now!
Looker Studio vs Metabase: Which BI Tool Actually Fits Your Team?
Looker Studio and Metabase both help you turn raw data into dashboards, but they take completely different approaches. This guide breaks down where each tool fits, what they are good at, and which one matches your actual workflow.
How to Create a Photo Album in Meta Business Suite
How to create a photo album in Meta Business Suite — step-by-step guide to organizing Facebook and Instagram photos into albums for your business page.