ОП пытается сопоставить данные из Листа 1 с Листом 2, а затем заполнить ячейку в Столбце I соответствующей строки на Листе 1 данными из Столбца D соответствующего значения Листа2.Проблема ОП заключалась в получении соответствующих данных для столбца D листа 2 и последующем сохранении их в соответствующую строку столбца D на листе 1.
Соответствующие различия с кодом ОП:
- Выполнить все
getValues()
методы до цикла => более быстрый и эффективный код. - Данные базы данных получаются в двух транзакциях.
- 1) все данные в электронной таблице (включая столбец A и столбец D) и
- 2) только столбец A;это делается для создания единого массива для сопоставления.
- Данные деко получают только один раз - для столбца D.
- Значения для столбца D деко и столбца A базы данных являются двумерными массивами;чтобы упростить сопоставление, они оба «сведены» в одномерные массивы.
- 2D-значение
getValues()
может выглядеть следующим образом:
[[r88], [g90], [h105], [i119], [j125], [k133], [l142],[m154], [n164]] - массив 1D после «выравнивания» будет выглядеть так:
[r88, g90, h105, i119, j125, k133, l142, m154, n164]
- Существует один цикл, основанный на значениях из столбца деко D.
- Каждое значение сравнивается со столбцом базы данных А.
- Для поиска совпадений используется метод
Indexof
. - Результирующее значение - это первый индекс, по которому значение может быть найдено в массиве, или -1, если его нет.
- Соответствующее значение из столбца базы данных D получено и «помещено» во временный массив («updateColI»).
- Когдацикл завершен, вновь созданный массив используется с методом
setValues()
для обновления значений в столбце Deco. D
Я оставил в коде несколько операторов "Logger"так что пользователь может найти соответствующиезначения по мере выполнения кода.
function so5813783501() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ssDeCo = ss.getSheetByName("Deco");
var lr1 = ssDeCo.getLastRow();
var ssDataBase = ss.getSheetByName("Database");
var lr2 = ssDataBase.getLastRow();
// get the data from database
var dbRange =ssDataBase.getRange(2,1,lr2-1,4);
// Logger.log("DEBUG: dbRange = "+dbRange.getA1Notation());
var dbData = dbRange.getValues();
// get ColA data from database
var dbColA = ssDataBase.getRange(2,1,lr2-1,1);
// Logger.log("DEBUG: dbColA = "+dbColA.getA1Notation());
var dbColAData = dbColA.getValues();
// flatten the data on ColA of the database
var flatCola =dbColAData.reduce(function(a, b){return a.concat(b);});
// Logger.log(flatCola); // DEBUG
// get the data from Deco
var decoRange = ssDeCo.getRange(2,5,lr1-1,1);
// Logger.log("DEBUG: decoRange = "+decoRange.getA1Notation());
var decoData = decoRange.getValues();
// Logger.log(decoData); DEBUG
// flatten the Deco data array
var flatDeco =decoData.reduce(function(a, b){return a.concat(b);});
// Logger.log(flatDeco); // DEBUG
var updateColI = [];
// Loop through the Deco data to find match on Database
for (var i=0;i<decoData.length;i++){
// find a match on database Column A
var idx = flatCola.indexOf(decoData[i][0]);
//Logger.log("DEBUG: i = "+i+", value = "+decoData[i][0]+", and idx = "+idx)
// if idx = -1, then no match, otherwise macth value if the sequence number on the database.
if (idx !=-1){
// do something
updateColI.push([dbData[idx][3]]);
}
else{
updateColI.push([""]);
}
}
// Logger.log(updateColI); //DEBUG
// update Deco
var fillDeco = ssDeCo.getRange(2,9,lr1-1,1);
Logger.log("DEBUIG: Fill Deco range = "+fillDeco.getA1Notation())
fillDeco.setValues(updateColI);
}