Limpiar filas con emails inválidos de una hoja de cálculo de Google

Pues llevo bastante peleándome con este asunto, ya que, si no fuera porque la función tiene que hacer muchas cosas más, tardaría menos haciéndolo con filtros a mano…

La cosa es que quiero eliminar de un Google Sheet todas las filas cuya celda de email sean inválidos o de Gmail.

Al principio lo hice con una macro que me dio el siguiente código:

function Limpiarfilasycolumnas() {    //Seleccionar hoja y empezar   var spreadsheet = SpreadsheetApp.getActive();     //No funciona   //Localizar y eliminar todo lo que no sea un email   spreadsheet.getRange('E:E').activate();   spreadsheet.getRange('E:E').createFilter();   spreadsheet.getRange('E1').activate();   var criteria = SpreadsheetApp.newFilterCriteria()   .whenFormulaSatisfied('=NOT(REGEXMATCH(E:E;"^([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})$  "))')   .build();   spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);   var sheet = spreadsheet.getActiveSheet();   sheet.getRange(2,1,spreadsheet.getActiveSheet().getLastRow()).activate();   spreadsheet.getActiveSheet().deleteRows(spreadsheet.getActiveRange().getRow(), spreadsheet.getActiveRange().getNumRows());   spreadsheet.getActiveSheet().getFilter().remove();    //No funciona   //Localizar y borrar los emails de Gmail   spreadsheet.getRange('E:E').activate();   spreadsheet.getRange('E:E').createFilter();   spreadsheet.getRange('E1').activate();   var criteria = SpreadsheetApp.newFilterCriteria()   .whenTextContains('gmail.com')   .build();   spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);   var sheet = spreadsheet.getActiveSheet();   sheet.getRange(2,1,spreadsheet.getActiveSheet().getLastRow()).activate();   spreadsheet.getActiveSheet().deleteRows(spreadsheet.getActiveRange().getRow(), spreadsheet.getActiveRange().getNumRows());   spreadsheet.getActiveSheet().getFilter().remove();   }; 

Pero haciendo pruebas me percaté de que si la hoja era distinta, ya no funcionaba la macro… Así que después de leerme todas las preguntas con título relacionado, me decanté por hacerlo por Javascript como comentaba el usuario Rubén en una de sus respuestas.

Así que, he hecho el código simulando el filtro con Javascript y me ha quedado lo siguiente:

function Pruebas()  {   var ss = SpreadsheetApp.getActive();   limpia_columna_email(ss.getActiveSheet());   SpreadsheetApp.getUi().alert("Hoja actualizada correctamente"); };  function limpia_columna_email(ss) {   var emails = ss.getRange("E:E").getValues();   for(var i = emails.length-1; i > 0 ; i--)   {     if(!validar_mail(emails[i][0])) ss.deleteRow(i+1);   } };  function validar_mail(email) {   var patron = new RegExp("^([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})$  ");   if(email == null || email == "") return false;   if(email.search("gmail.com") != -1) return false;   return patron.test(email);   return false; //Aquí no debe de llegar nunca }; 

Ahora bien, la hoja que le paso tiene más de 5000 filas… y ejecutar el código ha tardado una barbaridad (vamos, si me descuido me veo el capítulo de Stranger Things entero…).

Más que optimizar, que también sería bienvenido ¿se os ocurre como hacerlo de otra manera para que no tarde tanto?

Gracias de antemano.