0

У меня есть функция, которая пересекает массив 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(); 
}; 
+2

Каждый вызов api getCell требует времени, поэтому гораздо быстрее использовать .getValues ​​() только один раз, который возвращает двумерный массив, содержащий значения диапазона. Также установите новые значения с помощью .setValues ​​(newValues) в диапазоне, только один вызов api в конце. –

ответ

1

Вам все равно необходимо использовать петлю (ы), но код можно оптимизировать. Используйте вначале getValues(). Это возвращает 2D-массив. Вы можете использовать .indexOf(), чтобы определить, есть ли совпадение в другом массиве.

function moveValues() { 
    var i,L,sh,ss,srcRng,destRng,srcData,targetData,v; 

    ss = SpreadsheetApp.openById('open_id'); 
    sh = ss.getSheetByName('sheet2');//Get sheet2 
    lastRow = sh.getLastRow();//Get the row number of the last row 

    srcRng = sh.getRange(1,1,lastRow);//Get the range for all the values in column 1 
    destRng = sh.getRange(3,1,lastRow);//Get the range for all the values in column 3 

    srcData = srcRng.getValues();//Get a 2D array of values 
    targetData = destRng.getValues();//Get a 2D array of values 

    srcData = srcData.toString().split(",");//Convert 2D to 1D array 
    targetData = targetData.toString().split(",");//Convert 2D to 1D array 

    L = srcData.length; 

    for (i=0;i<L;i++) {//Loop the length of the source data 
    v = srcData[i];//Get this value in the array 
    if (targetData.indexOf(v) !== -1) {//This value was found in target array 

    } 
    } 

Это не полный ответ на ваш вопрос, но, надеюсь, он даст вам несколько идей.

В этом примере код получает только столбцы данных для сравнения, а не столбцы данных для изменения.