I've always used that method to activate scripts in PlayerGui by making a BoolValue in Workspace or some other directory and have a script like this (This would be the script inside the PlayerGui).
Frame = script.Parent.Frame Value = workspace.Value while wait(.5) do if Value.Value == true then Frame.Visible = true end end
This isn't efficient, I've seen people control all Gui's with one script in Workspace. I could never figure out how they did it without annoying loops and values. I've been scripting with Lua for about a year now and still haven't figured this out.
As Perci1 suggested, use a changed event to detect the value change, rather than just checking it over and over. He also said to change the Visible property to the same thing as Value's value.
Frame = script.Parent.Frame Value = workspace.Value Value.Changed:connect(function() Frame.Visible = Value.Value --If Value's Value is true, make it visible. If false, make invisible end)
An alternative method would be to clone the Gui into the player's PlayerGui. The best way would be to use a RemoteEvent.
Look for "Client Event" on the wiki