How would I make objects spawn in random locations then tween positions of the random spawning parts / unions?

I’m trying to make these couches (shown below) spawn in outside of a map, then once spawned in they tween to a new location on the other side of the map, how would I do this?

I know to get my parts randomly spawn I can just do something like the code listed below but I dont want them to spawn in this certain area (red), only the green area

local parts = game.ReplicatedStorage.Items:GetChildren() 

while wait() do
 local randompart = (parts[math.random(1, #parts)]) 
 local clone = randompart:Clone() 
 clone.Parent = game.Workspace
 clone.Position = Vector3.new(math.random(0, 0), 0, math.random(0, 0)) 
 wait(120)
 clone:Destroy() -
 wait(5) 
end

Yet this script above will not work exactly on how I like, because it will spawn in the whole area, including the red area I don’t want them to spawn in, also with they would only spawn in one at a time when I want multiple (maybe 5-8) chairs coming at the player at once So how would I make them spawn in properly?

Once they spawn in on one of the green sides, I want them to then tween to the other side, as the player will be in the red area trying to dodge the chairs coming out from the walls, where I don’t even know where to start with that. (ps. chairs are a union, not sure if that changes anything)

Asking for a lot, but I’m really lost on where to start and how to make it work properly.

(gif shown below of what i’m going for, but obviously i couldnt make the chairs move at the same time on both sides)

chairmoving

Well, first of all. The code you provided for the random placement is bad. This is because if you have any terrain or many objects in the map, the couches will collide with them. In addition to that, the couches will spawn outside the preferred map boundaries if you do not set any limits.

I suggest using raycasting for random object generation:

local ServerStorage = game:GetService("ServerStorage") -- if objects are stored inside serverstorage
local AmountOfObjectsYouWishToSpawn = --number here

local Params = RaycastParams.new() -- if you want to use raycast parameters

for x = 1, AmountOfObjectsYouWishToSpawn do 
    task.wait() -- just taking precautions against any possible crashes
    local RandomX = math.random() -- here you need to put the map's minimum and maximum X positions
    local RandomZ = math.random() -- and here the same but on the Z axis
    local Height = --height to shoot the raycast from
    local Origin = Vector3.new(RandomX, Height, RandomZ)
    local Direction = Vector3.new(0, -300, 0) -- we can do something like -300 on Y axis
    local Result = workspace:Raycast(Origin, Direction, Params)
    if Result then
        local Object = ServerStorage.Object:Clone() -- we take the object
        Object.Parent = workspace
        Object.Position = Result.Position -- or :GetPivot().Position, depending if its a model or a basepart
    end
end