Google Sheets Importer
Tool Goals
Cut iteration time: Designers should be able to hit one button and refresh data straight from a Google Sheet, no CSV exporting required.
Stay in-engine: No jumping back and forth between tools, Unreal should fetch and update automatically.
Safe & predictable: Imports should completely clear old rows and only reflect what’s in the sheet. No leftover “zombie” data.
Flexible: The same tool should support different DataTables each pointing to their own sheets.
Background & Why
As I was working on this system and slowly realizing that a DataTable was probably necessary for this system to work, I became a bit frustrated at the import pipeline Unreal has. Go to Excel/Google Sheets, export, import… it's a tedious process that takes a couple minutes for larger files. What if I could automate it?
The marketplace has a few decent one-click import plugins for DataTables, but honestly I didn’t want to spend the extra cash and it didn’t seem hard to implement. So I jumped into true editor tooling for Unreal, something I hadn’t done before!
The solution isn’t glamorous, so I’ll instead focus on the process:
First Iteration
The first version of this importer was barebones. I just needed to get a sheet linked and rows imported. I turned to Python since it’s Unreal’s tooling language of choice and has a fairly complete API (well, “complete” in a very old and clunky sense). I bounced back and forth between the API docs, GPT, and VS Code until I landed on a solution that worked: I could hardcode a Google Sheet link in Python and import that data straight into a DataTable.
It was progress, but there were major problems I couldn’t ignore:
The sheet link was fixed in the script, meaning each DataTable would require manually editing the code.
Rows would add, but not clear, leaving behind stale “zombie data.”
The script could only be run manually through the command line, which defeated the point of a one-click workflow.
Iterating on the Core Problems
Each of those pain points became the next step. First, I reworked the import logic so every time the script ran it would wipe the DataTable clean, then repopulate it with only the fresh rows from the sheet. That solved the zombie rows.
Next, I shifted the script into an actual editor tool. Instead of manually calling it from the command line, I added a context menu option in the Unreal editor. Now you could right-click on a DataTable and hit “Reload from Sheet.” Instantly better
Taking that a step further you can also click a context button inside of the DataTable that does the same thing.

Making DataTables Remember Their Sheet
The last hurdle was the sheet link itself. Hardcoding URLs was obviously a dead end, but Unreal’s Python API doesn’t expose much in the way of custom properties. I briefly considered hijacking built-in fields, but that was messy and unreliable.
The real solution was metadata. Unreal lets you attach arbitrary metadata to assets, and Python can both read and write those tags. That meant I could set a “SheetURL” tag on each DataTable and have the tool pull it automatically. With this, each DataTable became self-contained—no scripts to edit, no hardcoded values, just right-click and refresh… except it wasn't quite that simple.
While you can view Metadata natively in Unreal, you can't edit it. That is, unless you make yet another tool to do so. To fix this I made another tool via an Unreal Editor Utility Widget
that allowed me to pass a url which would then be set as that actor's MetaData (under SheetUrl)

Result
What started as a clunky command-line script ended up as a genuinely useful editor tool. Designers can now:
Right-click any DataTable and hit “Reload from Sheet" or click the context button inside the DataTable.
See rows clear and refresh instantly, with no stale data.
Link each DataTable to its own Google Sheet through metadata, set once and forget.
It saves minutes every iteration, and more importantly, it keeps the workflow fully inside Unreal.