Service accounts have their own Google identity (an email address). The sheet must be explicitly shared with that email address, just as you would share it with a human colleague. Without this sharing step, the script receives a SpreadsheetNotFound error.