Hi,
I use something like this to scale my scrolling frames, without using Offset
I have a UIGridLayout in the scrolling frame.
The first bit of code here is just adding some dummy labels in, but the bits after that, you run whenever the contents of the frame have changed, either items added or removed.

The variables here;
numberOfExtraItems is a count of how many non-visual children the scrolling frame has, here I’ve got two, the UIGridLayour and this script. If you had others (UICorner, or whatever) change this count to include them
numberOfItemsPerRow is, well, how many items you want on a row. Looks like you would set this to 1
rowsPerScreen is how many rows to see at a time, from your screenshot this would be 5
local scrollingFrame = script.Parent
for i = 1, 25 do
local textLabel = Instance.new("TextLabel")
textLabel.Text = "Item " .. tostring(i)
textLabel.Parent = scrollingFrame
end
local numberOfExtraItems = 2
local numberOfItemsPerRow = 3
local rowsPerScreen = 5
local numberOfItems = #scrollingFrame:GetChildren() - numberOfExtraItems
local rows = math.floor((numberOfItems - 1) / numberOfItemsPerRow) + 1
local canvas = rows / (rowsPerScreen * 2)
scrollingFrame.CanvasSize = UDim2.new(0, 0, canvas, 0)
local height = 1 / rows
if height > 1 / rowsPerScreen then
height = 1 / rowsPerScreen
end
scrollingFrame:FindFirstChild("UIGridLayout").CellSize = UDim2.new(1 / numberOfItemsPerRow, 0, height, 0)