The 'basic scripting tutorial' is pretty saturated. It isn't worth it unless the tutorial is legitimately unprecedented from an insightful, experienced, successful coder, which I doubt you are. Not trying to stop you. But this is the likely consensus.
First of all, you should make it clear that the client table classes shouldn't be trusted on the server. The server should have its own table with the trusted values. Also, most of your client code is useless and can be shortened to:
local Class = game.ReplicatedStorage.Events.Class
local Buttons = script.Parent:GetChildren()
for a = 1, #Buttons do
local Button = Buttons[a]
if Button:IsA("GuiButton") then
-- Register the Button to a function
You should probably state that the classes table should be stored in a ModuleScript
With the limit, I was thinking you could determine to use a certain spreadsheet between two based on the users' userId. Example, if their userID was an even number you could use one spreadsheet over another to save data. This would just split the data between two spreadsheets, but doing something like that you could maybe use multiple spreadsheets.
You shouldn't start with an obby. You should start small, but limiting yourself to only an obby is bad. To learn the language well, I highly recommend making something creative and original.
Don't use game.workspace, use workspace or game.Workspace.
Your answer to the question "Why workspace" doesn't answer the question, nor make much sense.
Making something over and over helps you learn, sure, but forcing yourself to do the same thing over and over is very bad. Once you make something, you shouldn't feel urged to re-type that in the future, as long as you have a reference to it. Plus, you should improve yourself, and try new things instead of repeating the same thing over and over.
Your code is really bad. It's bad because:
1.) You're not using a local function
2.) You're using connect instead of Connect
3.) You're using findFirstChild instead of FindFirstChild
4.) You're checking if something is nil, which isn't necessary.
5.) You're not checking if players' characters touch the brick, but instead if anything with a humanoid touched the brick.
6.) This code assumes the script is inside the part, which isn't bad, but it's not good.
I would change the kill brick to something like this:
local Players = game:GetService("Players")
--// Workspace Variables
local killbrick = workspace:WaitForChild("KillBrick") -- define kill bricks
-- NOTE: It would be better to maybe loop though a folder of kill bricks or something instead, but this is just an example.
hit.Parent:BreakJoints() -- fun
Again, repeating something over and over isn't good for understanding how something works necessarily. It would be better to experiment with the code instead of re-create it.
For the last thing, I don't want to bother going over the code, but in this code you're using completely different methods than the first, which makes this look like an obvious free model. You don't even go over the code, so this doesn't really teach anyone anything. Also, it's not good to name a variable spawn, because spawn is already a function in Lua.
I don't think it's bad that you're trying to help people, but because you're in my discord server I know you don't know much about Lua, and I don't think you should try to teach others how to learn Lua if you don't know Lua yourself.