Скрипт приложения для цикла работает медленно. Необходимо оптимизировать код для более быстрого обновления.
Этот код работает отлично, но он медленный, как черепаха. Обычно я не использую этот подход, но мне не удалось найти другого варианта.
Что ж, мое требование состоит в том, чтобы где-либо в коде столбца найти 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());
}
}
});
}
Это может потребовать некоторой настройки, потому что я не тестировал это, так как у меня нет данных для этого.