App Script For Loop 很慢需要优化代码以加快更新速度

App Script For Loop is Slow Need to optimize code for faster update

此代码运行完美,但速度慢得像乌龟。通常我不采用这种方法,但我找不到任何其他选择。

好吧,我的要求是在列代码中的任何地方找到 1 获取该索引定义范围的键和值,然后转到 sheet 找到键并将值粘贴到所需的列中。

如果我可以跳转到 1 在选定列中的单元格并获取索引以找到键和值,然后跳转到键所在的页面键列而不是转到每个单元格并检查它是否有没有。

我是应用程序脚本的新手,如果没有什么帮助就更好了。 提前谢谢你。

function Data_Update(){

  //assigning sheet name to variables
  var ss = SpreadsheetApp.getActive()
  var from = ss.getSheetByName("From Sheet")//update here from sheet name(Updated)
  var To= ss.getSheetByName("To Sheet")//update here to sheet name(Updated)

  // Creating Loop 
  for (var i = 4;i<=7000;i++){//Update here from which row to start
    //assigning values to check if there is 1 in column K
    var udaterang = from .getRange("K"+i).getValue()//update here from which column to check for
    Logger.log(i)
   // Checking condition if the value is diffrent from the value already is
    if (udaterang == 1) {
      //creating key to find the value
      var name1 = from .getRange("A"+i).getValue()//update here the key column 1
      var name2 = from .getRange("B"+i).getValue()//update here the key column 2
      var name3 = from .getRange("C"+i).getValue()//update here the key column 3
      var name = name1.trim()+name2.trim()+name3.trim()
      var rng = from .getSheetValues(i,4,1,7)//start row, start column, # rows, # columns
      
      // Looping through each cell to check if the data needs update
      for(var j=2;j<=12500;j++){
        var key = To.getRange("AP"+j).getValue()
        if(key == name){ //[1] because column B
          To.getRange("AI"+j+":"+"AO"+j).setValues(rng)
          break
      }
      }
      
    }

  }
  
}

试试这个:

function Data_Update() {
  const ss = SpreadsheetApp.getActive();
  const fsh = ss.getSheetByName("From Sheet");
  const fkvs = fsh.getRange(4, 11, fsh.getLastRow() - 3).getValues().flat();
  const fvs = fsh.getRange(4, 1, fsh.getLastRow() - 3, fsh.getLastColumn()).getValues();
  const tapvs = tsh.getRange(2, 42, tsh.getLastRow() - 1).getValues().flat();

  fkvs.forEach((k, i) => {
    let udaterang = k;
    if (k == 1) {
      let name = fvs[i][0].toString().trim() + fvs[i][1].toString().trim() + fvs[i][2].toString().trim();
      let idx = tapvs.indexOf(name);
      if (~idx) {
        tsh.getRange(idx + 2, 35, 1, 7).setValues(tsh.getRange(i + 2, 4, 1, 7).getValues());
      }
    }
  });
}

这可能需要一些调整,因为我没有测试过,因为我没有这样做的数据。