'How can I improve this for loop based code so it runs faster?

The code below has been working, but I'm afraid that with a couple of thousands rows more, it can get laggy and I was wondering what would be the approach to improve it.

It basically compares 2 datasets by a number common to both and update a couple of columns with their status/checkboxes (TRUE, or FALSE):

function onEdit(e) {
if (e.range.getSheet().getName() === 'Todays Tests V2' && e.range.getA1Notation() === 'C3') {
    var formRespSheet = e.source.getSheetByName('Form Responses 1');
    var formRespRng = formRespSheet.getRange(2, 13, formRespSheet.getLastRow() - 1, 4);
    var formRespValues = formRespRng.getValues();

    var todaysTest = e.source.getSheetByName('Todays Tests V2');
    var todaysTestData = todaysTest.getRange(6, 1, todaysTest.getLastRow(), 18).getValues();

    todaysTest.getRange('O6:O').clearContent();
    todaysTest.getRange('Q6:Q').clearContent();
    todaysTest.getRange('R6:R').clearContent();

    for (var i = 0; i < formRespValues.length; i++) {
      for (var j = 0; j < todaysTestData.length; j++)
        if (formRespValues[i][1] == todaysTestData[j][1]) {
          if (formRespValues[i][0] == 'Yes') {
            todaysTest.getRange('O' + (6 + j)).setValue('TRUE')
          } else {
            todaysTest.getRange('O' + (6 + j)).setValue('FALSE')
          }
          if (formRespValues[i][2] == 'Yes') {
            todaysTest.getRange('Q' + (6 + j)).setValue('TRUE')
          } else {
            todaysTest.getRange('Q' + (6 + j)).setValue('FALSE')
          }
          if (formRespValues[i][3] == 'Yes') {
            todaysTest.getRange('R' + (6 + j)).setValue('TRUE')
          } else {
            todaysTest.getRange('R' + (6 + j)).setValue('FALSE')
          }
        }
    }


Solution 1:[1]

try that...

function onEdit(e)
  {
  if ( e.range.getSheet().getName() === 'Todays Tests V2' 
    && e.range.getA1Notation() === 'C3') 
    {
    let 
      formRespSheet  = e.source.getSheetByName('Form Responses 1')
    , formRespRng    = formRespSheet.getRange(2, 13, formRespSheet.getLastRow() - 1, 4)
    , formRespValues = formRespRng.getValues()
    , todaysTest     = e.source.getSheetByName('Todays Tests V2')
    , todaysTestData = todaysTest.getRange(6, 1, todaysTest.getLastRow(), 18).getValues()
      ;
    todaysTest.getRange('O6:O').clearContent();
    todaysTest.getRange('Q6:Q').clearContent();
    todaysTest.getRange('R6:R').clearContent();

    for (const frv of formRespValues)
      {
      let
        frv0test = (frv[0] == 'Yes') ? 'TRUE' : 'FALSE'
      , frv2test = (frv[2] == 'Yes') ? 'TRUE' : 'FALSE'
      , frv3test = (frv[3] == 'Yes') ? 'TRUE' : 'FALSE'
        ;
      todaysTestData.forEach( (ttd,j) =>
        {
        if (frv[1] == ttd[1])
          {
          let j6 = j+6
          todaysTest.getRange(`O${j6}`).setValue( frv0test )
          todaysTest.getRange(`Q${j6}`).setValue( frv2test )
          todaysTest.getRange(`R${j6}`).setValue( frv3test )
          }
        })
      }
    }
  } 

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1