Assistance Needed: Syncing Google Sheets with Notion for Row Updates

I hope this message finds you well.

I’m trying to create an automation between Google Sheets and Notion using Make. Specifically, I have a Google Sheet where:

  1. New rows are added regularly.
  2. Existing rows are updated frequently.

What I need is for these changes in Google Sheets (both new rows and updates to existing rows) to trigger updates in specific fields of a Notion database. Essentially, I want my Notion database to reflect the most recent state of the Google Sheet.

Could you please guide me on how to set up this scenario correctly? I’m looking for the best way to achieve this, ensuring seamless synchronization between the two platforms.

Thank you for your assistance, and I look forward to your advice.

Oh man. I want to do the same thing only the other way around. I have a Database in Notion that I want to sync with a Google Sheet.

It pains me that no one has answered in more than 1 month to you.

Maybe now? Anyone? Help us? :smiley:


Personally I managed to ADD new ROWS to the Sheet whenever I am doing an update, but this is adding a new ROW. I am also appending changes to Cells. Not only that, but in 1 “run” I could have new rows, but also changes to cells.

Hey,
I can offer a logical framework for how to structure this type of automation:

  1. Ensure there is a common, unique property/column between your Notion database and the Google Sheets
  2. Watch for new/updated rows
  3. Search for the database item / row (based on the common, unique property/column)
  4. If it already exists, update it
  5. If it doesn’t already exist, create it

I managed to have huge success doing this. I can basically right now get new rows in, update rows that have modifications.

I am trying to make a new Automation that will compare the 2 tables and if the table doesn’t exist in Notion anymore, also delete it from the Spreadsheet. I’m having some problems here.

One thing that I have a problem with is that I have done this using Notion → Search Object. But ideally this script will run only when I do some changes in my Notion Database. I see that “Watch Database Items” exist, but how is that working? I still seem to have a timer that I configure.

“Watch database items” polls for new/updated database items in the selected Notion database. This check happens on the frequency you set in the scenario (the most frequent is every 1 minute). This trigger will run every time there is a change in ANY property in the selected Notion database.

If you want to save operations and trigger the scenario immediately upon specific property changes instead, you can use Webhooks (video explaining how they work here)

So basically the watch database items will only send new and updated rows. Right now the way I did it Notion sends all the tables. Not sure how it is ideal, but what I know is that this is an operation that should run only when I make changes. I will look into web hooks.

Worst case scenario I can make this run manually.

Thanks

Heyyy :slight_smile: can you share the exact scenario structure, i can’t seem to make it work for me. Thanks!




Any questions? Where are you failing?

Amazing! Thanks for sharing this detailed breakdown. I used “ID does not exist” as the filter before the “Add a Row” module and it worked!

Been wanting to make this for a long time now, super happy it’s working. Just a few questions:

  1. What’s the logic behind “Row number exists” in the filter before the “Update row” module? 2. Why are we filtering the “search rows” module by ID (column from sheets) = ID (notion attribute)?
  2. This scenario doesn’t account for deleted pages. Any idea how to add that?
  3. The “search objects” module will look at the most recently added pages. What if I update an old database page, I’ll have to increase the limit to search for those and update them, correct?

Thanks again!

I kind of forgot some of the logic behind all this. I’m just happy that when I push a button thigs go from Notion to Sheets :slight_smile:

From my memory, I compare to see the ID of the Entry from Notion to Sheets. If it exists it will go on the Update path, if it does not exist it will go on the Add path. Basically I need to find a way to see if an Entry (notion database page/row or however we should call them) already exists in the Sheet. I do that by comparing the IDs.

Yea, I had the same problem with the Deleted entries and I tried to make a new automation, but I ran out of free cycles so I might do that next month :)) So in this automation if you delete something from Notion, it will still remain in the Sheet.

  1. I’m not sure. I think that when you update let’s say 21 rows, not matter how old, they get marked as "changed’. So when that module starts he will pull those 21 rows no matter how old they are. So he will not search for everything. So if you update a row from 2 years ago, it will not matter because it will just be marked a recently changed.

Anyway, I tried to simplify everything so it will just do whatever I required today. Keeping things simple.

P.S. The main thing why I wanted to do this is to give access to Gemini AI to a Google Sheet that has info about my YouTube videos that I make. Title, descriptions, keywords, transcript, etc.

Thanks for this! I get you lol. I just like to know how things work, but ey as long as it’s working im not complaining :slight_smile:

Re 3. totally understood, will test it out. I’ll try finding the solution to deleting rows and lyk.

As for your use-case, cool! What’s your channel?

Not yet “officially launched”.

Hi Simo!

I’m following up on my previous post regarding the automation between Google Sheets and Notion. My current goal is to sync data from Google Sheets to Notion by using a unique key—the email address—that exists in both platforms.

Here’s the issue I’m facing:

When I map the email field dynamically from Google Sheets into the filter of the Notion “Search Objects” module (using expressions like lowe(trim(field in the spreadsheet)) to ensure the value is clean), the module fails to find a matching record in Notion. Strangely, if I manually input the email value, the search returns the expected record.

I’ve double-checked the formatting on both sides, tried various cleaning functions, and ensured that the email field in Notion is of type “Text.” However, the dynamic mapping still doesn’t work as expected.

Could you please advise if this is a known issue with dynamic fields in the “Search Objects” module? Is there an alternative approach or workaround that would allow the dynamic email value from Google Sheets to correctly match and update the corresponding record in Notion?

Thank you very much for your assistance and for all the great work you do with Make.
I have attached some examples showing how manually inputting the email works and how I’m trying to achieve the same using the formulas mentioned above


Hi Ricardo,
Thank you for your clear question. When you “Run this module only”, you need to input only the actual Email, not including the trim() function. The way you have it set in the screenshot, the Notion module would be searching for “Email” “contains” “trim(F)”.

So, input an actual email in place of “F”, so that Make can simulate an actual run.

Hello again everybody!

Any ideas on how to sync deleted rows between Notion and Google Sheets? I’m currently able to add new rows and update existing ones, but not delete rows in sheets if that page was deleted in Notion.

When you watch for updated database items or use “Search objects”, you can filter for those pages that have the “archived” parameter TRUE (i.e., deleted)

I see. I tried applying that, it didn’t return any pages as archived. I also tried the “in_trash” parameter, same result.

This is my scenario, it would be very helpful to get some insights on why this could be the case. Thanks!

The overall scenario (limit = 1000, it searches the whole database):


The “archived” filter (returned 0 pages, even though I deleted a page prior to running the scenario)

The search rows module (in order to return a row number to be used in the “delete row” module)

Hi, thanks for clarifying the “Run this module only” behavior and that a static field like the email must be used there. However, the issue persists: when I run “Run Once” in the scenario (using the dynamic value from the Google Sheets Search Rows module), I still don’t get a match in the Notion Search Objects module. It appears that the transformation—using functions like trim()—is not producing the expected result when Make passes the value from the Sheets module to Notion. I’m not sure what I’m doing wrong.

I’ve attached a video to illustrate what happens. Any further guidance or suggestions on additional steps would be greatly appreciated.

Thank you very much!

You could try with the filter parameter “Boolean”/“checkbox” instead of Text, because “Archived” is a boolean value

It looks like Bundle 1 doesn’t have any email value (column F). You may add a filter between the Google Sheets and the Notion modules – “F” “exists”
image