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