Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

61
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda