У меня есть функция, которая пересекает массив C: D, чтобы найти совпадение в A: B, если он заменяет значение в B с помощью D и если нет совпадения, он добавляет C: D - A: B. Эта функция использует циклы. Я знаю, что есть способ оптимизировать это, но я потерян. Как еще этот скрипт может работать без циклов?Оптимизация скрипта приложений Google для замены/добавления значений
function moveValues() {
var ss = SpreadsheetApp.openById('open_id');
var source = ss.getRange('sheet2!D:C');
var destination = ss.getRange('sheet2!A:B');
var destCount = 0;
for (var j = 1; j <= destination.getLastRow(); j++) {
if (destination.getCell(j,1).getValue() == "") {
destCount = j;
break;
}
}
for (var i = 1; i <= source.getLastRow(); i++) {
Logger.log(source.getLastRow());
var added = false;
var targetName = source.getCell(i,1).getValue();
var copyValue = source.getCell(i,2).getValue();
if (targetName == "") {
break;
}
for (var j = 1; j <= destCount; j++) {
var curName = destination.getCell(j,1).getValue();
if (copyValue != "" && targetName == curName) {
destination.getCell(j, 2).setValue(copyValue);
added = true;
break;
}
}
if (!added) {
destination.getCell(destCount, 1).setValue(targetName);
destination.getCell(destCount, 2).setValue(copyValue);
destCount += 1;
}
}
source.clear();
};
Каждый вызов api getCell требует времени, поэтому гораздо быстрее использовать .getValues () только один раз, который возвращает двумерный массив, содержащий значения диапазона. Также установите новые значения с помощью .setValues (newValues) в диапазоне, только один вызов api в конце. –