Why getValue in a loop kills performance
Every call to getValue — or getValues on a single cell — issues a separate network request to the Sheets API. Apps Script runs server-side on Google's infrastructure, but the Spreadsheet service is still a separate process, and each call crosses that boundary. A loop over 25 cells means 25 round-trips. At roughly 50–100 ms each under normal quota, a modest loop becomes a multi-second stall before you've done any real work.
The execution quota makes this worse. Apps Script allows 6 minutes of total runtime per execution for consumer accounts, 30 minutes for Workspace. A tight getValue loop on a few hundred rows can burn minutes of that quota on I/O alone. I've seen scripts that read a 200-row column hit the 6-minute wall every single run, simply because no one batched the read.