Why the error appears after you add a new service
Apps Script builds an OAuth scope set from every Google service your code references. When you first authorized the project, it asked for exactly those scopes. The moment you add a call to a new service — say, GmailApp after your script previously only touched SpreadsheetApp — the required scope set changes, but the stored authorization token does not. The runtime hits a Gmail API call, checks the token's granted scopes, finds gmail.send missing, and throws the error.
The frustrating part: the error message says nothing about which scope is missing. It reads the same whether you forgot one scope or ten. If your script calls multiple services, you may trip over this error again after each addition until you resolve the full set.