Я создаю сценарий в Google Apps Script, который сравнивает два листа в электронной таблице строка за строкой в определенном столбце, содержащем уникальные идентификаторы. Если A [i] в листе (1) отличается от A [i] в листе (2), я хочу, чтобы вся строка с этой ячейкой была скопирована на новый лист. Листы действительно большие, несколько тысяч рядов.
До сих пор я дошел до того, что сценарий копирует значение один раз, а затем продолжает цикл без дальнейших результатов. Кроме того, это занимает много времени, и я подозреваю, что это может быть очень неоптимальным. Мне очень сложно отлаживать в Google Apps Script, и я в конце концов. Вот что у меня есть и мои комментарии.
function compareSheetDrop(input) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
//create a new blank sheet where the output will be stored
ss.insertSheet(5);
/*create references to sheets used by the script.
dropSheet is the sheet used as a basis,
compareSheet is a sheet possibly containing new values,
resultSheet is the blank sheet that will store new values
*/
var dropSheet = ss.getSheetByName("Drop (2)");
var compareSheet = ss.getSheets()[4];
var resultSheet = ss.getSheets()[5];
/*loop over the entire dropSheet and look for differences.
The sheets have header rows*/
for (var i = 2; i <= dropSheet.getLastRow(); i++) {
/*variable j will represent the row number
where the difference will be pasted to
resultsSheet.A[j] etc.*/
var j = 1;
/*establish references to the cells
that will be used for comparison
(i.e. A[i] in dropSheet, A[i] in compareRange)*/
var dropRange = dropSheet.getRange(i, 1);
var compareRange = compareSheet.getRange(i, 1);
/*establish references to the row
that will be copied from compareSheet
and to the row that
will be the destination in resultsSheet*/
var resultRange = resultSheet.getRange(j, 1);
var entireRow = compareSheet.getRange(i, 1);
/*check if the unique value of
cell dropSheet.A[i] is different from
compareSheet.A[i] and whether they are not blanks.
If they are different,
copy entire row from compareSheet to the resultsSheet*/
if (dropRange.getValues()[0] !== compareRange.getValues()[0] && dropSheet.getRange(i, 1).isBlank() == false && compareSheet.getRange(i, 1).isBlank() == false) {
j++;
entireRow.copyTo(resultRange, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}
}
}
Я ожидаю, что resultSheets будет полон строк из CompareSheet, которых нет в dropSheet, но вместо строки я заполняю одну ячейку A1, и тогда ничего не происходит, пока скрипт еще работает. Я подозреваю, что проблема может быть в самом цикле и в copyTo, но я не могу найти причину.