Creé la siguiente función que itera sobre las filas en una hoja de Google y coloca el texto "No" en una columna específica si los valores en cualquiera de las otras dos columnas contienen cualquiera de las cinco subcadenas posibles; de lo contrario, coloca el texto "Sí". en esa columna. La función funciona según lo previsto, pero es muy lenta.
Específicamente, esta es una hoja que contiene información de la cuenta del usuario. Cada fila es un registro de usuario. emailCol contiene la dirección de correo electrónico del usuario y lastNameCol contiene el apellido del usuario. Si la dirección de correo electrónico o el apellido contienen alguna de las subcadenas en los patterns de la matriz, establezco el valor de realAcctCol en "No"; de lo contrario, establezco ese valor en "Sí".
Este script actualmente tarda 20 minutos en iterar 1400 filas. ¿Hay alguna manera de hacer esto más rápido?
Vengo de un entorno de Microsoft Excel/VBA, por lo que tiendo a iterar sobre rangos. ¿Me estoy perdiendo una forma obvia de hacer esto de manera más eficiente?
function checkRealUsers() { const patterns = ["notreal","demo","notauser","test","debug"]; const realAcctCol = 9; const emailCol = 3; const lastNameCol = 2; var curRow = 2; var ss = SpreadsheetApp.getActive(); var sheet = ss.getSheetByName("Registered Customers"); var curEmail = sheet.getRange(curRow, emailCol).getValues()[0][0]; var curLastName = sheet.getRange(curRow, lastNameCol).getValues()[0][0]; //console.log(curVals[0][0]); while(curEmail != "") { sheet.getRange(curRow, realAcctCol).setValues([["Yes"]]); //console.log(curEmail.toLowerCase() + " " + curLastName.toLowerCase()); for (var ndx in patterns) { //console.log(patterns[ndx]); if ((curEmail.toLowerCase().indexOf(patterns[ndx]) != -1) || (curLastName.toLowerCase().indexOf(patterns[ndx]) != -1)) { //console.log("Test account!"); sheet.getRange(curRow, realAcctCol).setValues([["No"]]); } } curRow = curRow + 1; curEmail = sheet.getRange(curRow, emailCol).getValues()[0][0]; curLastName = sheet.getRange(curRow, lastNameCol).getValues()[0][0]; } } function checkRealUsers() { const patterns = ["notreal", "demo", "notauser", "test", "debug"]; const curRow = 2; const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName("Registered Customers"); const vs = sh.getRange(2, 1, sh.getLastRow() - 1, 9).getDisplayValues(); let col9 = sh.getRange(2, 9, sh.getLastRow() - 1).getValues(); vs.forEach((r, i) => { if (patterns.includes(r[2]) || patterns.includes[r[1]]) { col9[i][0] == "No" } }); sh.getRange(2,9,col9.length,col9[0].length).setValues(col9); }Quizá esto te funcione mejor:
function checkRealUsers() { const patterns = ["notreal", "demo", "notauser", "test", "debug"]; const curRow = 2; const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName("Registered Customers"); const vs = sh.getRange(2, 1, sh.getLastRow() - 1, 9).getDisplayValues(); let col9 = sh.getRange(2, 9, sh.getLastRow() - 1).getValues(); vs.forEach((r, i) => { for(let j = 0;j < patterns.length; j++ ){ if(~r[2].toString().indexOf(p) || ~r[1].toString().indexOf(p)) { col9[i][0] == "No"; break; } } }); sh.getRange(2,9,col9.length,col9[0].length).setValues(col9); }Creo que su objetivo es el siguiente.
"notreal","demo","notauser","test","debug" , desea poner No a la columna "I". Cuando esos valores recuperados no incluyen las palabras "notreal","demo","notauser","test","debug" , desea poner Yes a la columna "I".En este caso, ¿qué tal el siguiente script modificado?
function checkRealUsers() { const patterns = ["notreal","demo","notauser","test","debug"]; const sheet = SpreadsheetApp.getActive().getSheetByName("Registered Customers"); const values = sheet .getRange("B2:C" + sheet.getLastRow()) .getValues() .map(([b, c]) => [patterns.every(p => !b.toLowerCase().includes(p) && !c.toLowerCase().includes(p)) ? "Yes" : "No"]); sheet.getRange(2, 9, values.length, 1).setValues(values); }["notreal","demo","notauser","test","debug"] y, a continuación, se crea una matriz que incluye los valores de No y Yes . Y, la matriz creada se coloca en la columna "I".