What atHour actually promises
Apps Script time-based triggers do not fire at a precise clock time. When you call atHour(8), you are telling the scheduler to run your function sometime between 8:00 and 9:00 AM in the script's timezone — not at exactly 08:00:00. Google's infrastructure batches trigger execution and spreads it across that window. If your job must run at exactly 8:05, Apps Script is the wrong tool; use Cloud Scheduler calling a Cloud Function instead.
The script's timezone is set per project, not per user. Go to Project Settings (the gear icon in the left sidebar) and check the Time zone field. If that reads America/New_York and your Sheets data is in UTC, every atHour call is offset accordingly. I've burned a morning debugging a report that always showed yesterday's data — the trigger was firing at what was effectively midnight UTC.
One practical consequence: if you chain two time-based triggers expecting a gap of exactly one hour between them, that gap can be anywhere from zero to two hours on a bad day. Build tolerance into any logic that depends on recency.