Runtime DataTable - Import/Export text CSV or Google Sheet at runtime and auto-update structs and UObjects!

Can you show me the code where you attempt to write? The error indicates that the spreadsheet ID number is incorrect.


My sheetID always get 0 value.

Hi, how to generate .CSV that has multiple sheet tab?

Ok so the problem here is that the URL you’re passing in to get the Sheet Id doesn’t have the “gid” part of the URL in it. If there is no “gid” part, 0 will be returned since that is usually the default sheet ID.

If you could, please try copy-pasting the link again from your sheet, ensuring that “gid” is in the query parameters. I can see in your second screenshot that the “gid” is there in the address bar, so you just gotta make sure it’s in the string variable in unreal as well.

The error occurs because it seems you don’t have any tabs in your sheet with a gid of 0, so the default of 0 won’t work here.

CSVs don’t really have any way to handle multiple tabs, so instead you’d need to have a CSV for each sheet tab. Just ensure you have a link with the proper gid assigned to each tab.

@JaredTherriault

Hello.
Thank you for such a wonderful plugin :grin:
I have a question about encryption.

I use your plugin to get a table (Logins and passwords). (Probably not the best solution).

But nevertheless, when I get a response from (Google excel), it gives me the entire list of passwords, which I then compare with the password that the user entered.

I believe that the variable in which I write all the data can be easily read through third-party programs.

Is there a way to encrypt the data or somehow solve this problem?

How about - TEA (Tiny Encryption Algorithm)?

Hello Nizami_Nz, thank you for your kind words!

I wouldn’t recommend RDT for sensitive data, or even Google Sheets for that matter, because as you said, it’s all legible plain text. Google doesn’t do any server-side encryption, just account auth. When RDT requests the sheet, Google only responds with plain text.

To do this securely you would either A) have a server instance to which the end user sends the user/pass and have the server check the response against the sheet or B) make sure all data is encrypted before even sending it to Google. Then decrypt when you pull from Google.

Encryption is outside of the scope of the plugin, really. There are myriad solutions for this on the marketplace as is, though! For example, this plugin uses TEA and is available for free: DH Key Exchange and TEA Encryption | Fab

1 Like

To Answer your questions:

  • I have that flow inside of the GameMode Blueprint tied to Event BeginPlay. (see image)
  • No other users / projects are accessing this sheet.

I guess I am mostly wondering what comprises a request … is 1 request equal to all the data on 1 sheet / url or is 1 request equal to 1 row of 1 sheet.

I looked it up and the Google API for Sheets basically limits the Read request per minute per user to 60 (so one Read request per second I guess)

This is the flow I have, one Sheetfile, with 6 sheets / direct sheet URLs being queried.

Yes, this looks solid - 6 total requests every time the Game mode is initialized. That shouldn’t be a problem.

Are you a solo developer? Do you work in a team?

Is this a networked game? That is to say would there be multiple game modes initializing at once in a multiplayer setting?

Another idea is that this is a restriction per account - so if you’re making requests to any sheets with the same account, those would count toward the restriction as well.

Try this to troubleshoot on your local workstation - first make sure this setting is checked in Project Settings > Plugins > Runtime DataTable:

Then restart the editor, start the game, and check the logs.

You should only be seeing up to 6 instances of logs like this:

“LogRuntimeDataTable: GenericValidateHttpResponse: GET Response received, success: true, Response code: 200, Response”

If you see more than that then that means something is afoot with the setup.

If not then we’ll have to dig deeper!

Thank you for posting your solution, I was running into the same issue. Only the last index of the struct/array would be outputted by runtimedatatable. Manually adding the first column of numbers fixed it for me.

@JaredTherriault

Hey! I have quick question about Runtime DataTable Plugin

I’m developing a multiplayer game. A player converts a local CSV file into a data table. The system I previously built randomly selects a row from the table and sends the question in it to other players as a string. Is this possible?

Hi solucan03! This is absolutely possible. When a CSV is imported with the plugin, it creates a CSV_Map object. There is a function specifically for what you’re asking - “GetRowAsStringArray”. It just needs the “key” for the row you want, which is the value in the first column of the CSV. You can also get just a specific cell value, “GetRowValueAsString”, based on the row/column name.

New version finally approved for 5.4, 5.5, and 5.6!

-Prevent registering project settings with the editor UI if not with editor
-Implement settings for controlling output logging
-Update EasyCsv module name and deprecation messages
-Ensure a CSVInfo struct has a specific amount of keys before access

1 Like