如何使用 GAS 改进这个嵌套的 for 循环?

How to improve this nested for loop using GAS?

我想学习 运行 这个 for 循环的另一种方法,因为目前,它通过每次迭代设置值,并且随着它可以变大,最好提高性能。

function calculate() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const settingSheet = ss.getSheetByName('settings'); 
const dataSheet= ss.getSheetByName('Data'); 

let settingData = settingSheet.getRange(1, 1, settingSheet.getLastRow(), settingSheet.getLastColumn()).getValues();
let spcData = dataSheet.getRange(1, 1, dataSheet.getLastRow(), dataSheet.getLastColumn()).getValues();

let recordTypesAccepted = ['strategy1', 'goal2'];

var settingPar1 = settingData.filter(e => e[0] == 'default').map(e => e[1]);
var settingPar2 = settingData.filter(e => e[0] == 'default').map(e => e[2]);

for (let a = 0; a < spcData.length; a++) {
  for (let r = 0; r < settingData .length; r++) {

      let settingSearchTerm = settingData[r][4];
      let spcSearchTerm = spcData[a][10];

      let settingMatchType = settingData[r][5];
      let spcMatchType = spcData[a][9];

      let spcRecordType = spcData[a][8];

      if (recordTypesAccepted.indexOf(spcRecordType) > -1 && settingMatchType === spcMatchType) {
        if (settingSearchTerm == spcSearchTerm) {
          settingPar1 = settingData[r][7];
          settingPar2 = settingData[r][6];
        }

        let spcClicks = spcData[a][10];
        let spcOrders = spcData[a][11];

        let row = a + 1;

        if (spcClicks >= settingsPar1 && spcOrders >= settingsPar2) {
          let newValue = 10;
          spcSheet.getRange(row, 20).setValue(newBid).setBackground("#D8E271");
        }
      }
    }
  }
}

谢谢!!!

描述

如果使用 setValues() 不会覆盖任何公式,您可以使用 getValues() 获取旧值数组,替换任何需要更新的值,然后使用 setValues() 简单地放回值数组.背景和数字格式相同。

请注意,OP 假定 spcSheet 在别处定义。

脚本

function calculate() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const settingSheet = ss.getSheetByName('settings'); 
  const dataSheet= ss.getSheetByName('Data'); 

  let settingData = settingSheet.getRange(1, 1, settingSheet.getLastRow(), settingSheet.getLastColumn()).getValues();
  let spcData = dataSheet.getRange(1, 1, dataSheet.getLastRow(), dataSheet.getLastColumn()).getValues();

  let recordTypesAccepted = ['strategy1', 'goal2'];

  var settingPar1 = settingData.filter(e => e[0] == 'default').map(e => e[1]);
  var settingPar2 = settingData.filter(e => e[0] == 'default').map(e => e[2]);

  let spcRange = spcSheet.getRange(1,20,spcSheet.getLastRow(),1)
  var spcValues = spcRange.getValues();
  var backgrounds = spcRange.getBackgrounds();
  var numberformats = spcRange.getNumberFormats();

  for (let a = 0; a < spcData.length; a++) {
    for (let r = 0; r < settingData .length; r++) {

      let settingSearchTerm = settingData[r][4];
      let spcSearchTerm = spcData[a][10];

      let settingMatchType = settingData[r][5];
      let spcMatchType = spcData[a][9];

      let spcRecordType = spcData[a][8];

      if (recordTypesAccepted.indexOf(spcRecordType) > -1 && settingMatchType === spcMatchType) {
        if (settingSearchTerm == spcSearchTerm) {
          settingPar1 = settingData[r][7];
          settingPar2 = settingData[r][6];
        }

        let spcClicks = spcData[a][10];
        let spcOrders = spcData[a][11];

        if (spcClicks >= settingsPar1 && spcOrders >= settingsPar2) {
          let newValue = 10;
          spcValues[a][0] = newBid;
          backgrounds[a][0] = "#D8E271";
          numberformats[a][0] = "€##0.00";
        }
      }
    }
  }
  spcRange.setValues(spcValues);
  spcRange.setBackgrounds(backgrounds);
  spcRange.setNumberFormats(numberformats);
}

参考