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

302
Views
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 answers
Answer question

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 Report

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 Report

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 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!