Garrett was born in Lesmahagow, South Lanarkshire. He played for Lesmahagow Juniors before coming to England as a 17-year-old to sign for Preston North End. He made his debut in the Football League on 5 February 1938 in the First Division match away against Birmingham. Preston rested players to save them for an FA Cup-tie against Arsenal, so the 18-year-old Garrett came in at inside left, and was part of "a footballing feast of delightful, imaginative, attacking football" which his club won 2–0. He scored twice in his only other league game for North End before returning to Scotland in December 1938 to join Heart of Midlothian, who paid a club record fee of £4,000 for his services. Hearts had a high-scoring run in the 1939 Scottish Cup: Garrett scored six as they beat junior club Penicuik Athletic and another four as they beat Highland League side Elgin City 14–1. Drawn against Celtic in the Third Round, in what was the first all-ticket match at Tynecastle, Garrett equalised "in the dying seconds" to earn a replay, which Celtic won 2–1 with a goal that appeared not to have crossed the line. In May and June 1939, Garrett toured North America with a Scottish Football Association XI, scoring 19 goals from 8 matches. In the 1938–39 season he had scored 29 goals in all competitions, of which 17 were in the Scottish League, and 24 the following season, by which time the Second World War was under way. During the war he played a few games for Hearts in the 1943–44 season, and also made guest appearances for Northampton Town and Bristol City. He returned to Hearts after the war, but his stay was brief: he and teammate Jimmy Briscoe signed for Northampton Town, of the English Third Division South, in September 1946. Garrett maintained his scoring record: in the 1946–47 season he scored 32 goals in all competitions, of which 26 were in the league, and he added another 9 to his league tally before joining Second Division side Birmingham City in November 1947, for what was then a club record fee received of £10,000. He went straight into the starting eleven, but scored only once in his first six games, lost his place, and was unable to regain it. The following season, in the First Division, Garrett had a run of games in place of Harold Bodle: he scored four goals, of which one was the only goal of the game, and two secured 1–1 draws, yet as soon as Bodle became available for selection, Garrett was dropped. In December 1948, he returned to Northampton Town, where he finished his Football League career at the end of the 1950–51 season. He had spells in non-league football with Wisbech Town and Holbeach United. In the 1960s, Garrett worked for the GPO in Bristol. He died in the city in 1994.