Why hard-coded column numbers always break eventually
The moment someone inserts a column to the left of your 'Email' column, col 3 becomes col 4 and your script silently reads the wrong data. No error, no warning — just garbage, or an empty string that passes your null check and corrupts downstream output. I've burned an afternoon tracking down exactly this after a client added a 'Phone' column without telling me.
The fix is to read row 1 once at the start of your script and build a plain object that maps each header string to its 1-based column index. After that, every getRange call uses col['Email'] instead of the magic number 3, and inserting columns becomes a non-event.