Weekly reports can send themselves: 9 steps, little or no code
Google, Microsoft and Zapier each include a scheduler that can send the report on time; how to set one up, and the documented limits that break it later.
The short read
If your team uses Google Workspace or Microsoft 365, a scheduler that sends the weekly report already comes with it.
- Setting the timer is easy; reports break later because a schedule runs on one person's login or fires at a random minute.
- A broken automated report rarely looks broken. It looks like a quiet week.
What you can do with this
Put a check cell beside each key number that flags a week with no data, and include it in the email. A failed import then reaches everyone instead of passing as a quiet week.
In this article
- 1. Write down how the report gets made today
- 2. Choose the scheduler that comes with what you already pay for
- 3. Build the report from formulas in one spreadsheet
- 4. Put a check cell beside every number that matters
- 5. Set the schedule in the tool you picked
- 6. Schedule the run an hour after the data is final
- 7. Send the draft and every failure to one owner first
- 8. Run the old and new report side by side for three weeks
- 9. Plan for the day the owner’s account goes away
If your team works in Google Workspace or Microsoft 365, a scheduler that can send the weekly report on its own already comes with it. Data Studio, the tool Google used to call Looker Studio, emails a report as a PDF on a timer. Power Automate runs a flow every week, and its free license covers work accounts at no extra cost.
The timer is the easy part. What breaks these reports months later sits in the fine print. A trigger may fire at a random minute within the hour. A schedule may run on one person’s login and fail once they leave.
A broken automated report rarely looks broken. It looks like a quiet week. The nine steps below set up the schedule and put a guard on each weak point. Most need no code at all; one option needs six lines.
1. Write down how the report gets made today
Build the report by hand one more time and write down every step. Each export counts, each copy and paste, each “then I check whether sales has sent its numbers”. That list is your specification. It will be longer than you expect.
For every number, add two facts: where it comes from and when it is final. “Invoices sent: accounting export, final Friday 06:00” is a useful line. “Revenue: from the system” is not.
Then ask who reads each section and what they decide because of it. Delete what nobody reads. A section with no reader is cheaper to remove today than to automate, schedule and maintain for the next several years. Our payback template puts hours on that upkeep before you build.
2. Choose the scheduler that comes with what you already pay for
All five options below can run once a week. They differ in what they can read and in how they fail.
| Your setup | Scheduler | Code? | The limit to know, as of October 2026 |
|---|---|---|---|
| Google, report is charts | Data Studio scheduled delivery | None | 50 recipients; without Pro, one schedule per report and at most daily |
| Google, report is a sheet | Workspace Studio flow | None | Business Starter and up; an admin must turn on Gemini |
| Google, custom logic | Apps Script trigger | 6 lines | 90 trigger minutes a day on a personal account, 6 hours on Workspace |
| Microsoft 365 | Power Automate Recurrence | None | Free license: standard connectors only, and flows can’t be shared |
| Mixed tools | Zapier Schedule | None | Free plan: 100 tasks a month, two-step Zaps |
Our view: start with the suite your team signs in to every morning. A second platform means another login and another place to look when something fails.
Zapier earns its place when the numbers live in tools Google and Microsoft can’t reach. Its free plan allows only two-step Zaps, one trigger and one action.
A Zap that reads a sheet and then emails it needs a trigger and two actions. That means Professional, at $19.99 a month billed annually for 750 tasks as of October 2026. The schedule trigger itself doesn’t count toward task usage. For what a longer workflow costs on Zapier, Make and n8n, see our pricing of one workflow on all three.
3. Build the report from formulas in one spreadsheet
Give each source its own raw tab, filled only by an import or by someone pasting that source’s export. Then make one report tab that calculates everything the report shows: totals, change since last week, distance to target. No typed numbers on that tab. A typed number goes stale, and nobody knows when.
Protect the report tab so a helpful colleague can’t type over a formula. In Google Sheets, open Data, then Protect sheets and ranges, and pick Restrict who can edit this range. Google says protection shouldn’t be used as a security measure, so treat it as a guard against accidents.
On Microsoft 365, format each raw range as an Excel table, because Power Automate’s Excel actions work on tables. Its List rows present in a table action returns up to 256 rows by default unless you turn on pagination. Without that switch, a report that grows past 256 rows comes out short and says nothing.
4. Put a check cell beside every number that matters
Next to each key figure, add a cell that flags data you shouldn’t trust. Two checks cover the failures that look most like a normal week: nothing arrived, or something jumped.
- Nothing arrived:
=IF(COUNTIFS(Raw!A:A,">="&B1,Raw!A:A,"<"&B1+7)=0,"NO DATA","OK"), where column A of the Raw tab holds dates and B1 holds the Monday of the reporting week. - Something jumped:
=IF(ABS(C5/D5-1)>0.5,"CHECK","OK"), where C5 is this week and D5 last week. If last week was zero, the cell shows an error, which is also worth a look.
Color the flags with Format, then Conditional formatting, then Custom formula is. Google notes that these formulas can only reference the same sheet unless you use INDIRECT, so keep the check cells on the report tab. Then include them in the message itself. A failed import should land in front of everyone, including the people who never open the sheet.
5. Set the schedule in the tool you picked
Each set of steps uses the vendor’s own menu names.
- Data Studio: open the report, click Share, then Schedule delivery. Add up to 50 recipients, pick pages, set the start date and time, then use Repeat; Custom handles “every two weeks on Friday”. The email carries the PDF, a preview of page one and a link.
- Workspace Studio: start a flow with the On a schedule starter, set a start date and time, choose Weekly and set the time zone. Add Get sheet contents, then Send an email, or Post in a space for Google Chat.
- Power Automate: go to My flows, Create from blank, add the Recurrence trigger, and set Interval to 1 and Frequency to Week. Pick a Time zone, the day under On these days and the hour under At these hours. Add Excel’s List rows present in a table, then Create HTML table to turn the rows into a table, then Outlook’s Send an email (V2). Both connectors are standard.
- Zapier: choose Schedule by Zapier, trigger event Every Week, then Day of the Week and Time of Day.
- Apps Script: in the sheet, open Extensions, then Apps Script, paste the function below and change the tab, range and address. Then click Triggers, then Add Trigger, choose the function and a weekly time-driven timer, and save.
function sendWeeklyReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const rows = ss.getSheetByName('Report').getRange('A1:B12').getDisplayValues();
const body = rows.map(r => r.join(': ')).join('\n') + '\n\n' + ss.getUrl();
MailApp.sendEmail('team@example.com', 'Weekly report', body);
}
It mails the report tab’s cells as displayed, check cells included, with a link to the sheet. Run it once from the editor before you add the trigger, because triggers must be authorized by the person who created them. MailApp can reach 100 recipients a day from a personal account and 1,500 from Workspace.
6. Schedule the run an hour after the data is final
Timers are looser than they look. Apps Script says a trigger’s time might be slightly randomized. One set for 9 a.m. runs at a time it picks between 9 and 10, then keeps that time day to day. Zapier says its schedule should run within a few minutes of the set time.
Time zones are the other trap. Zapier uses your Zapier account’s time zone and shows run times in UTC in Zap history. Change the zone, and you must turn the Zap off and on again.
Data Studio follows your operating system’s time zone, and you can’t change it inside Data Studio. Power Automate asks for a start time in a UTC format plus a separate Time zone field, so set that field.
So if a source is final at 06:00, schedule for 07:30 rather than 06:05. Buy yourself the hour. Check the first run after the clocks change for daylight saving time.
One more surprise for teams outside the US: Data Studio’s scheduled reports use US English formatting even if your account is set to another language. Read 10/03 as October 3.
7. Send the draft and every failure to one owner first
The automation can fetch and add up. It can’t write the two sentences that say revenue dipped because two large invoices slid into next week. So send the finished report to one owner at 07:30, and let them add that comment and forward it by 09:00.
The owner is also where failures should land, and each tool raises them differently. When a trigger fails, Apps Script shows nothing on screen and sends an email with a link to reconfigure or switch it off. Power Automate turns off a cloud flow whose trigger or actions fail continuously for 14 days. If those alerts go to an inbox nobody reads, the report simply stops one Friday.
8. Run the old and new report side by side for three weeks
Keep building the report by hand and compare the two, number by number. A comparison tab makes it quick: =IF(Report!C5=Manual!C5,"","DIFF") in each cell that matters.
Every difference is a bug in one of the two versions. Expect some in the manual one. Switch off the hand-built report only after three weeks in a row with no differences you can’t explain.
9. Plan for the day the owner’s account goes away
Most schedulers run as a person, not as the team. Apps Script triggers always run under the account of the person who created them. A flow built on Power Automate’s Free license can’t be shared at all.
Data Studio schedules run with the credentials of whoever last saved them. When that account goes inactive, the schedule fails until an active editor opens it, clicks Edit and saves. Until then, nothing arrives.
Write a short note at the top of the sheet. Say which account runs each schedule and who owns the report, then what to do when a check cell turns red. Add one line to your offboarding checklist: move or re-save every schedule the leaver owns before their account is closed.
Start with step 1 this Friday. Build the report by hand one last time, with a blank document open beside it, and write down every click.
Sources
- Google: Schedule automatic report delivery, Data Studio
- Google: Installable triggers, Apps Script
- Google: Quotas for Google services, Apps Script
- Google: Scripts bound to Google Docs, Sheets, Slides and Forms
- Google: Authorization for Google services, Apps Script
- Google: Guide to starters and steps, Workspace Studio
- Google: Access to Workspace Studio
- Google: Use conditional formatting rules in Google Sheets
- Google: Protect, hide and edit sheets
- Microsoft: Run a cloud flow on a schedule in Power Automate
- Microsoft: Limits of automated, scheduled and instant flows
- Microsoft: Types of Power Automate licenses
- Microsoft: Excel Online (Business) connector
- Microsoft: Office 365 Outlook connector
- Microsoft: Use data operations in Power Automate
- Zapier: Schedule by Zapier triggers
- Zapier: Plans and pricing