I am trying to make a script that saves multiple values I can save the value if I set it directly inside the datatosave table but for some reason when I try to save the value from the player It says the wring value. I used a print statement right before the save to detect that its not the save function that's the problem but just accessing the correct data. What's your thoughts?

--Get The Service's
local replicatedStorage = game:GetService("ReplicatedStorage")
local dsService = game:GetService("DataStoreService")
local mainStore = dsService:GetDataStore("MainDataStore")

local DataToSave = {}
--create player data
game:GetService("Players").PlayerAdded:Connect(function(plr)
	
	--create folders
	
	local leader = Instance.new("Folder",plr)
	leader.Name = "leaderstats"
	
	local achievementsFolder = Instance.new("Folder",leader)
	achievementsFolder.Name = "Achievements"
	
	local gameplayStats = Instance.new("Folder",leader)
	gameplayStats.Name = "GameplayStats"
	
	local playerStats = Instance.new("Folder",leader)
	playerStats.Name = "PlayerStats"
	
	
	--create achievements Values
	
	CompletedTutorial = Instance.new("BoolValue",achievementsFolder)
	CompletedTutorial.Name = "CompletedTutorialAchievement"
	CompletedTutorial.Value = false
	
	
	--create gameplay values
	
	CompletedMissions = Instance.new("IntValue",gameplayStats)
	CompletedMissions.Name = "CompletedMissions"
--	CompletedMissions.Value = 12
	
	FailedMissions = Instance.new("IntValue",gameplayStats)
	FailedMissions.Name = "FailedMissions"
	FailedMissions.Value = 0
	
	PreviousMission = Instance.new("StringValue",gameplayStats)
	PreviousMission.Name = "PreviousMission"
	PreviousMission.Value = "No Missions Attempted"
	
	TimesDied = Instance.new("IntValue",gameplayStats)
	TimesDied.Name = "TimesDied"
	TimesDied.Value = 0
	
	TrapsAvoided = Instance.new("IntValue",gameplayStats)
	TrapsAvoided.Name = "TrapsAvoided"
	TrapsAvoided.Value = 0
	
	TrapsFailed = Instance.new("IntValue",gameplayStats)
	TrapsFailed.Name = "TrapsFailed"
	TrapsFailed.Value = 0
	
	
	--create player values
	
	Coins = Instance.new("IntValue",playerStats)
	Coins.Name = "Coins"
	Coins.Value = 0
	
	
	local currentDay = os.date("*t").day
	local currentMonth = os.date("*t").month
	local currentYear = os.date("*t").year
	
	local dateJoined = (currentDay.."/"..currentMonth.."/"..currentYear)
	
	DateFirstJoined = Instance.new("StringValue",playerStats)
	DateFirstJoined.Name = "DateFirstJoined"
	DateFirstJoined.Value = dateJoined
	
	Rank = Instance.new("StringValue",playerStats)
	Rank.Name = "Rank"
	Rank.Value = "Junior Assistant"
	
	totalTime = Instance.new("IntValue",playerStats)
	totalTime.Name = "TotalTimePlayed"
	totalTime.Value = 0
	
	timePlayed = Instance.new("IntValue",playerStats)
	timePlayed.Name = "TimePlayed"
	timePlayed.Value = 0
	
	Experience = Instance.new("IntValue",playerStats)
	Experience.Name = "Experience"
	Experience.Value = 0
	
	wait(1)
	
	--load the data
	local success, err = pcall(function()
		local data = mainStore:GetAsync(plr.UserId) 
			--gameplay values
			CompletedMissions.Value = data[1] or 5
			--[[FailedMissions.Value = data[2]
			PreviousMission.Value = data[3]
			TimesDied.Value = data[4]
			TrapsAvoided.Value = data[5]
			TrapsFailed.Value = data[6]
			
			--player stats value
			Coins.Value = data[7]
			DateFirstJoined.Value = data[8]
			Rank.Value = data[9]
			totalTime.Value = data[10]
			Experience.Value = data[11]
			
			print(CompletedMissions.Value, FailedMissions.Value, PreviousMission.Value, TimesDied.Value, TrapsAvoided.Value, TrapsFailed.Value, Coins.Value, DateFirstJoined.Value, Rank.Value, totalTime.Value, Experience.Value)
			--]]
			print(CompletedMissions.Value)
	end)
	if err then
		print("error loading data")
	end
end)

--Increment Time Values
incrementor = coroutine.create(function()
	while wait(1) do
		timePlayed.Value = timePlayed.Value + 1
		totalTime.Value = totalTime.Value + 1
	end
end)

coroutine.resume(incrementor)

CompletedMissions.Changed:connect(function()
	DataToSave[1] = CompletedMissions.Value
	print("changed value to"..DataToSave[1])
end)

game:GetService("Players").PlayerRemoving:Connect(function(player)
	
	--[[
	local DataToSave = {CompletedMissions.Value, FailedMissions.Value, PreviousMission.Value, TimesDied.Value, TrapsAvoided.Value, TrapsFailed.Value, 
	Coins.Value, DateFirstJoined.Value, Rank.Value, totalTime.Value, Experience.Value}
	--]]
	
	print(player.leaderstats.GameplayStats.CompletedMissions.Value)

	local success, err = pcall(function()
		mainStore:SetAsync(player.UserId,DataToSave)
	end)
	if err then
		print("error saving")
	end
end)