The last couple of days I've been trying to make a script that teleports multiple people that are standing on a Part to a private server. And currently, I'm left with a script that partly works, but sometimes comes up with an error:

[ TeleportToPrivateServer must be passed an array of players ]

not sure what could cause the error because it doesn't address at which line it happen, but im pretty sure it's the function at line 37

-- Player and Place Variables -- 
local Players = game:GetService("Players")
local PlayersTouching = {}
local NeededPlayers = 1
local MaxPlayers = 4
local PlaceId = 0000000000

-- Services -- 

local RunService = game:GetService("RunService")
local TeleportService = game:GetService("TeleportService")

-- SurfaceGUI's for text -- 

local PlayerDisplay = script.Parent.Parent.PlayerDisplay.SurfaceGui:WaitForChild("TextLabel")
local StatusDisplay = script.Parent.Parent.StatusDisplay.SurfaceGui:WaitForChild("TextLabel")
local ServerDisplay = script.Parent.Parent.ServerDisplay.SurfaceGui:WaitForChild("TextLabel")
ServerDisplay.Text = "Server Size: " ..MaxPlayers

-- Other -- 

local Toucher = script.Parent.Parent:WaitForChild("MainPart")
local debounce = true

--/--

function IsPlayer(obj)
	if obj.Parent:IsA("Model") and obj.Parent:findFirstChild("Humanoid") then
		if Players:GetPlayerFromCharacter(obj.Parent) ~= nil then
			return true
		end
	end
	return false
end

-- function that teleports all the people to a private server -- 
function TeleportPlayers() 
	local PrivateServerId = TeleportService:ReserveServer(PlaceId)
	TeleportService:TeleportToPrivateServer(PlaceId, PrivateServerId, PlayersTouching)
end

-- functions that adds or removes players from the table --

Toucher.Touched:connect(function(obj)
	if IsPlayer(obj) then
		local CurChar = obj.Parent
		local CurPlayer = Players:GetPlayerFromCharacter(CurChar) 
		local index

		for i,v in pairs(PlayersTouching) do
			if v == CurPlayer then
				index = i
			end
		end
		
		if not index then
			table.insert(PlayersTouching, CurPlayer)
		end
		return CurPlayer
	end
	
end)

Toucher.TouchEnded:connect(function(obj)
	if IsPlayer(obj) then
		local CurChar = obj.Parent
		local CurPlayer = Players:GetPlayerFromCharacter(CurChar)
		local index

		for i,v in pairs(PlayersTouching) do
			if v == CurPlayer then
				index = i
			end
		end

		if index then
			table.remove(PlayersTouching, index)
		end
	end
end)


-- Main function that monitors everything -- 

RunService.Stepped:connect(function()
	
	if debounce then
		-- This just changes the text of GUI's
	    if #PlayersTouching >= NeededPlayers then 
			PlayerDisplay.Text = "Players: " ..#PlayersTouching.. "/ "..MaxPlayers
		    else
			PlayerDisplay.Text = "Players: " ..#PlayersTouching.. "/ "..MaxPlayers
		end
		
	if #PlayersTouching >= MaxPlayers then
		  debounce = false

			StatusDisplay.Text = "Status: Teleporting..."			
			TeleportPlayers() -- runs the function ( line 38 )
			
		 		wait(8)
	-- This loop will clear the table so next array of players can use the teleporter
					for k in pairs (PlayersTouching) do
						PlayersTouching [k] = nil
					end
			    wait(1)
			
			StatusDisplay.Text = "Status: Waiting For Players"
			PlayerDisplay.Text = "Players: " ..#PlayersTouching.. "/ "..MaxPlayers
		  debounce = true
		end
	end
end)

Thank you for your attention