Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

308
Vistas
How do i shorten time this GAS code(search correct column and data paste)

https://i.stack.imgur.com/7VAJk.png

i want to copy data from "dB" sheet A5:A29 and paste to correct column. so i use the script to find the correct column.

there range B2:CX2 have 0(not-correct) or 1(correct) value, so i use 'for' & 'if' BUT!! It's too delay!! i use console.time() and i get 25909ms(timecheck2 value) !!!

please help me.....

here is my code

function save(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('dB');
  
  console.time("timecheck1");
  //find last row
  var copyrangeO = sheet.getRange(5,1,25,1).getValues();
  var lastrowO = copyrangeO.filter(String).length; 
  var copyrange = sheet.getRange(5,1,lastrowO,1);
  console.timeEnd("timecheck1");
  
  //my dB data start "B2". 
  var cv = 1;
  
  //find correct value(1). B2 ~ CX2 (#100)
  console.time("timecheck2");
  for (var i=2; i<101;i++){
    if(sheet.getRange(2,i).getValue()===1){
      cv = i;
    }
  }
  console.timeEnd("timecheck2");

  //if data isn't correct, cv===1. so error msg print.
  console.time("timecheck3");
  if(cv ===1){
    Browser.msgBox("ERROR")
  }else {
    //data copy and paste.
    var columnToCheck = sheet.getRange(4,cv,1000).getValues();
    var lastrow = getLastRowSpecial(columnToCheck);
    var pasterange = sheet.getRange(lastrow+4,cv);
    copyrange.copyTo(pasterange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
    Browser.msgBox(lastrowO + " saved!");
  }
  console.timeEnd("timecheck3");
  
}

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

The function will spend most of its time in the for loop because it repeats the Range.getValue() call many times. You can speed things up quite a bit by getting all values with one Range.getValues() call, like this:

  let cv = 1;
  console.time("timecheck2");
  sheet.getRange('B2:B100').getValues().flat()
    .some((value, index) => (cv = 2 + index) && value === 1);
  console.timeEnd("timecheck2");

Note that this is not a cleanest way of finding cv, but it should help illustrate why you have a performance issue. You may want to do a complete rewrite of the code, using declarative instead of imperative style.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Issue:

If I understand your situation correctly, you want to find the cell in B2:CX2 in which the value is 1, but the script is taking too much time for this.

The problem here is that you are using getRange and getValue in a loop (sheet.getRange(2,i).getValue()===1). This greatly increases the amount of calls to the Sheets service, which slows down your script, as you can see at Minimize calls to other services.

Solution:

In that case, I'd suggest doing the following:

  • Get the values from all columns at once using getValues().
  • Use findIndex to get the column index for which value is 1.

In order to do that, replace this:

var cv = 1;

//find correct value(1). B2 ~ CX2 (#100)
console.time("timecheck2");
for (var i=2; i<101;i++){
  if(sheet.getRange(2,i).getValue()===1){
    cv = i;
  }
}

With this:

var ROW_INDEX = 2;
var FIRST_COLUMN = 2; // Column B
var LAST_COLUMN = 102; // Column CX
var columnValues = sheet.getRange(ROW_INDEX, FIRST_COLUMN, 1, LAST_COLUMN-FIRST_COLUMN+1).getValues()[0];
var cv = columnValues.findIndex(columnValue => columnValue === 1) + FIRST_COLUMN;

Note:

If there's no cell in the range with value 1, findIndex returns -1 which, added to FIRST_COLUMN, results in 1. That's appropriate for your current script, but won't work if the FIRST_COLUMN stops being 2, so be careful with this (either change the condition if(cv ===1){ to something less strict, or don't assign the resulting value to cv if findIndex returns -1).

about 4 years ago · Juan Pablo Isaza Denunciar

0

Try this:

I don't know what you're doing in the save because to did not supply the helper function code.

function save(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('dB');
  var vs0 = sh.getRange(5,1,25,1).getValues();
  var lr0 = vs0.filter(String).length; 
  var crg = sh.getRange(5,1,lr0,1);
  var cv = 1;
  const vs1 = sh.getRange(2,2,1,99).getValues().forEach((c,i) => {
    if(c == 1)cv = i + 2
  })
  if(cv == 1){
    Browser.msgBox("ERROR")
  }else {
    var vs2 = sh.getRange(4,cv,1000).getValues();
    var lastrow = getLastRowSpecial(vs2);
    var drg = sh.getRange(lastrow+4,cv);
    crg.copyTo(drg, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
    Browser.msgBox(lr0 + " saved!");
  }
}
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda