How I Used Power Automate to Stop My Dad From Copy-Pasting Monthly Excel Reports


My dad gets the same email every month. It has an Excel attachment. The attachment has that month’s work-material data in it. He downloads it, opens his yearly master spreadsheet, and copies the rows across by hand.

He has been doing this for years.

I told him I could fix that. And I did. It took a few hours across a couple of evenings and now the whole thing runs without him touching anything.

This is a writeup of how I built it.

The Manual Process Before I Touched It

Before building anything I sat down and actually understood what he was doing. This part matters more than people think.

The process was:

  1. Email arrives with the attachment
  2. He opens the email and downloads the file
  3. He opens the downloaded file
  4. He opens his master workbook separately
  5. He finds the right sheet for that month
  6. He copies the rows from the attachment
  7. He pastes them into the master
  8. He saves and closes both files

Eight steps. Every single month. Most of them manual, none of them interesting.

The attachment is always structured the same way. Same columns, same format, different data. The master workbook has a sheet for each month of the financial year. The goal was simple: take the attachment when it arrives and do those eight steps automatically.

Why Power Automate and Not a Python Script

My instinct as a developer is to reach for Python. I know it well, I can write it fast, and I can make it do exactly what I want.

But this was for my dad’s work machine. That machine is not mine to manage. Installing Python, scheduling a script, handling authentication to his email, maintaining it when something breaks — that is a support burden I didn’t want to create. If something goes wrong at 7am before he has to send a report, I need it to be fixable without me SSH-ing into anything.

Power Automate runs in the cloud. It connects to Outlook and OneDrive through his existing Microsoft 365 account. There is nothing to install, nothing to schedule, and the auth is handled by the platform. It is also something he can look at and roughly understand what it is doing, which matters.

Python would have been more flexible. Power Automate was more appropriate here.

The Flow, Step by Step

The full pipeline is:

Email arrives → attachment saved to OneDrive → Excel script runs → data appended to master workbook

Here is how each part works.

Trigger: Email with Attachment

The flow starts with an Outlook trigger that fires when a new email arrives matching specific conditions. In this case: from the expected sender, with an attachment.

This part is straightforward. Power Automate’s Outlook connector handles it cleanly and the trigger fires reliably.

Save the Attachment to OneDrive

Once the trigger fires, the flow extracts the attachment and saves it to a specific folder in OneDrive. The filename is the original attachment name, which already includes date information so nothing gets overwritten.

There is a dedicated folder for these. It acts as an inbox. The files sit there and also give him a full archive of every monthly attachment he has ever received, which turned out to be a useful side effect.

Run the Excel Script

This is the part that does the actual work.

Power Automate can run Excel scripts against files in OneDrive using the Excel Online connector. I wrote a short script that:

  1. Opens the monthly attachment
  2. Reads all the data rows from the table
  3. Opens the master workbook
  4. Finds the correct sheet for the current month
  5. Appends the rows to the existing data

The script is written in TypeScript. It is not long. The bulk of it is just reading from one table and writing to another.

One thing that required attention: the script needs to reference the table by name. The attachment file had no named table, just a range. I had to go into the file format and add a proper table definition before the script could target it reliably. Once that was in place everything worked consistently.

Done

No confirmation email, no notification, nothing. The data is just there. My dad checks his master workbook and it is already updated. He has not had to do the manual process once since I deployed this.

What Almost Broke It

The table naming issue I mentioned above was the main one. Power Automate’s Excel connector is fussy about targeting specific data. If you point it at a named table it works well. If you point it at a range or an unnamed sheet it becomes unpredictable. Getting that sorted before running the full flow saved a lot of debugging time.

The other thing I had to think about was timing. The script runs sequentially - it reads from the attachment, then writes to the master. Power Automate handles this fine but it means the flow is not instant.

What I Would Add Next

Right now the flow runs silently. If it fails, nobody knows immediately. I would add error handling that sends a notification if any step throws an error. Power Automate has a “run after” configuration that lets you define what happens on failure — I just haven’t set it up yet.

I would also add a confirmation step. After a successful run, send a short email saying the data was appended and which month it was. It is not necessary, but it turns the automation from something invisible into something he can trust. Invisible is fine until something goes wrong and you are not sure if the flow ever ran.

Is This Worth Building

Yes, obviously. But the reason it was worth building is not the time saving, even though that is real. It is that the task required enough concentration that it was easy to make a mistake. Copy-paste errors into a financial spreadsheet are not hypothetical. Now that source of error does not exist.

The actual build time was a few hours. The maintenance time has been zero. That ratio is what makes automation worth it — not the hours saved but the mental load removed and the error rate that goes to nothing.

If you have a recurring task in Microsoft 365 that follows a consistent pattern, Power Automate can almost certainly handle it. The learning curve is not steep and the payoff is immediate and worthy.