Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

58
Views
Cómo acelerar este script de Google Apps

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]; } }
about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

  • Ups, puse la respuesta incorrecta aquí, pero creo que la recuperé porque la guardaron en el historial (muchas gracias por hacerlo).

Esta función usa matrices para lograr lo mismo "con suerte", pero debería ejecutarse mucho más rápido.

 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); }
about 4 years ago · Juan Pablo Isaza Report

0

Creo que su objetivo es el siguiente.

  • Su guión funciona bien. Pero desea reducir el costo del proceso de su script.
  • Desea recuperar los valores de las columnas "B" y "C". Cuando esos valores recuperados incluyen las palabras "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?

Guión 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); }
  • En esta modificación, los valores se recuperan de las columnas "B" y "C", y se comprueba si los valores recuperados incluyen los valores de ["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".

Referencias:

  • mapa()
  • cada()
  • incluye()
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!