Keep getting "Players:GetUserIdFromNameAsync() failed: Unknown user"

  1. What do you want to achieve?
    A successful leaderboard without any issues.

  2. What is the issue?
    Whenever the leaderboard updates it gets this error


    and it doesn’t put my friend on the leaderboard but it puts me on it.

  3. What solutions have you tried so far?
    Looked it up and couldn’t find anything useful. I printed the “data.key” to see what could be making the error. It shows up my userId and “-1” which I don’t know where that number came from.

local dss = game:GetService("DataStoreService")
local coinsLead = dss:GetOrderedDataStore("coinsLead")
local holder = workspace:WaitForChild("Map"):WaitForChild("Town Square"):WaitForChild("Leaderboards"):WaitForChild("Leaderboard1"):WaitForChild("Backdrop"):WaitForChild("SurfaceGui"):WaitForChild("Holder")

local function updateLeaderboard()
	local success, err = pcall(function()
		local data = coinsLead:GetSortedAsync(false, 5)
		local coinsPage = data:GetCurrentPage()
		for rank, data in pairs(coinsPage) do 
			print(data.key)
			local name = game.Players:GetNameFromUserIdAsync(data.key)
			local coins = data.value
			local isOnLeaderboard = false
			for i, v in pairs(holder:GetChildren()) do
				if v.Player.Text == name then
					isOnLeaderboard = true
					break
				end
			end

			if coins and isOnLeaderboard == false then
				local newLbFrame = game.ReplicatedStorage:WaitForChild("LeaderboardFrame"):Clone()
				newLbFrame.PlayerTL.Text = name
				newLbFrame.CoinsTL.Text = coins
				newLbFrame.RankTL.Text = "#" .. rank
				newLbFrame.Position = UDim2.new(0,0,newLbFrame.Position.Y.Scale + (.08 * #holder:GetChildren()), 0)
				newLbFrame.Parent = holder
			end
		end
	end)
	if not success then
		warn(err)
	end
end

while true do
	wait(5)
	for _, player in pairs(game.Players:GetPlayers()) do
		coinsLead:SetAsync(player.UserId, player.leaderstats.Coins.Value)
	end

	for _, frame in pairs(holder:GetChildren()) do
		frame:Destroy()
	end

	updateLeaderboard()
	print("Leaderboard updated")

	wait(120)

end
1 Like

how about

nameFinder = getUsernameFromUserId(data.key)
name = game.Players:FindFirstChild(nameFinder)
1 Like

It says “GetUsernameFromUserId is not a valid member of Players “Players””

edited it try it now it should work

Did the same thing
image

local nameFinder = game.Players:getUsernameFromUserId(data.key)
			local name = game.Players:FindFirstChild(nameFinder)

Oh wait my bad lol I completely told you the wrong thing
Ok I have an alternative

Players:GetPlayerByUserId(data.key)

Another error came from it.

What my code looks like now:

local dss = game:GetService("DataStoreService")
local coinsLead = dss:GetOrderedDataStore("coinsLead")
local holder = workspace:WaitForChild("Map"):WaitForChild("Town Square"):WaitForChild("Leaderboards"):WaitForChild("Leaderboard1"):WaitForChild("Backdrop"):WaitForChild("SurfaceGui"):WaitForChild("Holder")

local function updateLeaderboard()
	local success, err = pcall(function()
		local data = coinsLead:GetSortedAsync(false, 5)
		local coinsPage = data:GetCurrentPage()
		for rank, data in pairs(coinsPage) do 
			print(data.key)
			local nameFinder = game.Players:GetPlayerByUserId(data.key)
			local name = game.Players:FindFirstChild(nameFinder)
			local coins = data.value
			local isOnLeaderboard = false
			for i, v in pairs(holder:GetChildren()) do
				if v.Player.Text == name then
					isOnLeaderboard = true
					break
				end
			end

			if coins and isOnLeaderboard == false then
				local newLbFrame = game.ReplicatedStorage:WaitForChild("LeaderboardFrame"):Clone()
				newLbFrame.PlayerTL.Text = name
				newLbFrame.CoinsTL.Text = coins
				newLbFrame.RankTL.Text = "#" .. rank
				newLbFrame.Position = UDim2.new(0,0,newLbFrame.Position.Y.Scale + (.08 * #holder:GetChildren()), 0)
				newLbFrame.Parent = holder
			end
		end
	end)
	if not success then
		warn(err)
	end
end

while true do
	wait(5)
	for _, player in pairs(game.Players:GetPlayers()) do
		coinsLead:SetAsync(player.UserId, player.leaderstats.Coins.Value)
	end

	for _, frame in pairs(holder:GetChildren()) do
		frame:Destroy()
	end

	updateLeaderboard()
	print("Leaderboard updated")

	wait(120)

end

Oh I see now it says string expected as the error so,

local StringKey = tostring(data.key)
Players:GetPlayerByUserId(StringKey)

Still showing the save thing

local StringKey = tostring(data.key)
			local nameFinder = game.Players:GetPlayerByUserId(StringKey)
			local name = game.Players:FindFirstChild(nameFinder)

I can’t seem to pinpoint the issue here, but remove the Findfirstchild part.

Is the user ID value correct?

Tested it again, I don’t know what happened but the output changed after I removed FindFirstChild.

wait show me the script as it is right now

local dss = game:GetService("DataStoreService")
local coinsLead = dss:GetOrderedDataStore("coinsLead")
local holder = workspace:WaitForChild("Map"):WaitForChild("Town Square"):WaitForChild("Leaderboards"):WaitForChild("Leaderboard1"):WaitForChild("Backdrop"):WaitForChild("SurfaceGui"):WaitForChild("Holder")

local function updateLeaderboard()
	local success, err = pcall(function()
		local data = coinsLead:GetSortedAsync(false, 5)
		local coinsPage = data:GetCurrentPage()
		for rank, data in pairs(coinsPage) do 
			print(data.key)
			local StringKey = tostring(data.key)
			local nameFinder = game.Players:GetPlayerByUserId(StringKey)
			local name = game.Players.nameFinder
			local coins = data.value
			local isOnLeaderboard = false
			for i, v in pairs(holder:GetChildren()) do
				if v.Player.Text == name then
					isOnLeaderboard = true 
					break
				end
			end

			if coins and isOnLeaderboard == false then
				local newLbFrame = game.ReplicatedStorage:WaitForChild("LeaderboardFrame"):Clone()
				newLbFrame.PlayerTL.Text = name
				newLbFrame.CoinsTL.Text = coins
				newLbFrame.RankTL.Text = "#" .. rank
				newLbFrame.Position = UDim2.new(0,0,newLbFrame.Position.Y.Scale + (.08 * #holder:GetChildren()), 0)
				newLbFrame.Parent = holder
			end
		end
	end)
	if not success then
		warn(err)
	end
end

while true do
	wait(5)
	for _, player in pairs(game.Players:GetPlayers()) do
		coinsLead:SetAsync(player.UserId, player.leaderstats.Coins.Value)
	end

	for _, frame in pairs(holder:GetChildren()) do
		frame:Destroy()
	end

	updateLeaderboard()
	print("Leaderboard updated")

	wait(120)

end
local coinsLead = dss:GetOrderedDataStore("coinsLead")
local holder = workspace:WaitForChild("Map"):WaitForChild("Town Square"):WaitForChild("Leaderboards"):WaitForChild("Leaderboard1"):WaitForChild("Backdrop"):WaitForChild("SurfaceGui"):WaitForChild("Holder")

local function updateLeaderboard()
	local success, err = pcall(function()
		local data = coinsLead:GetSortedAsync(false, 5)
		local coinsPage = data:GetCurrentPage()
		for rank, data in pairs(coinsPage) do 
			print(data.key)
			local StringKey = tostring(data.key)
			local nameFinder = game.Players:GetPlayerByUserId(StringKey)
			local coins = data.value
			local isOnLeaderboard = false
			for i, v in pairs(holder:GetChildren()) do
				if v.Player.Text == name then
					isOnLeaderboard = true 
					break
				end
			end

			if coins and isOnLeaderboard == false then
				local newLbFrame = game.ReplicatedStorage:WaitForChild("LeaderboardFrame"):Clone()
				newLbFrame.PlayerTL.Text = name
				newLbFrame.CoinsTL.Text = coins
				newLbFrame.RankTL.Text = "#" .. rank
				newLbFrame.Position = UDim2.new(0,0,newLbFrame.Position.Y.Scale + (.08 * #holder:GetChildren()), 0)
				newLbFrame.Parent = holder
			end
		end
	end)
	if not success then
		warn(err)
	end
end

while true do
	wait(5)
	for _, player in pairs(game.Players:GetPlayers()) do
		coinsLead:SetAsync(player.UserId, player.leaderstats.Coins.Value)
	end

	for _, frame in pairs(holder:GetChildren()) do
		frame:Destroy()
	end

	updateLeaderboard()
	print("Leaderboard updated")

	wait(120)

end

use this instead

I’m not sure how you want me to replace it because dss (data store service) isn’t defined and “name” isn’t defined.

local name = game.Players:GetPlayerByUserId(StringKey)
just put that where the other one is

You should first check if the usernames are valid (try printing them and searching them)

Doing this again. I don’t understand why it isn’t working. I tried putting my userid directly but it gave the same error.

My code currently:

local dss = game:GetService("DataStoreService")
local coinsLead = dss:GetOrderedDataStore("coinsLead")
local holder = workspace:WaitForChild("Map"):WaitForChild("Town Square"):WaitForChild("Leaderboards"):WaitForChild("Leaderboard1"):WaitForChild("Backdrop"):WaitForChild("SurfaceGui"):WaitForChild("Holder")

local function updateLeaderboard()
	local success, err = pcall(function()
		local data = coinsLead:GetSortedAsync(false, 5)
		local coinsPage = data:GetCurrentPage()
		for rank, data in pairs(coinsPage) do 
			print(data.key)
			local StringKey = tostring(data.key)
			local name = game.Players:GetPlayerByUserId(StringKey)
			local coins = data.value
			local isOnLeaderboard = false
			for i, v in pairs(holder:GetChildren()) do
				if v.Player.Text == name then
					isOnLeaderboard = true 
					break
				end
			end

			if coins and isOnLeaderboard == false then
				local newLbFrame = game.ReplicatedStorage:WaitForChild("LeaderboardFrame"):Clone()
				newLbFrame.PlayerTL.Text = name
				newLbFrame.CoinsTL.Text = coins
				newLbFrame.RankTL.Text = "#" .. rank
				newLbFrame.Position = UDim2.new(0,0,newLbFrame.Position.Y.Scale + (.08 * #holder:GetChildren()), 0)
				newLbFrame.Parent = holder
			end
		end
	end)
	if not success then
		warn(err)
	end
end

while true do
	wait(5)
	for _, player in pairs(game.Players:GetPlayers()) do
		coinsLead:SetAsync(player.UserId, player.leaderstats.Coins.Value)
	end

	for _, frame in pairs(holder:GetChildren()) do
		frame:Destroy()
	end

	updateLeaderboard()
	print("Leaderboard updated")

	wait(120)

end

This won’t work as it requires the player to be in-game.

How would I print them? I don’t see where to get the usernames.