Скрипт приложения для цикла работает медленно. Необходимо оптимизировать код для более быстрого обновления.

Этот код работает отлично, но он медленный, как черепаха. Обычно я не использую этот подход, но мне не удалось найти другого варианта.

Что ж, мое требование состоит в том, чтобы где-либо в коде столбца найти 1 получить ключ и значение этого диапазона, определенного индексом, и перейти к листу, найти ключ и вставить значение в требуемые столбцы.

Если я могу перейти к ячейкам, где 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
      }
      }
      
    }

  }
  
}

2 ответа

Пожалуйста, используйте пакетные операции . Чтобы быть конкретным, используйте getValues ​​()

Это самый простой способ лечения, но он имеет наибольшее влияние.

Попробуй это:

      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());
      }
    }
  });
}

Это может потребовать некоторой настройки, потому что я не тестировал это, так как у меня нет данных для этого.

Другие вопросы по тегам