У меня есть скрипт, который ищет совпадающие значения в двух таблицах. "ss1" & "ss2." Я изменил код, потому что его было слишком легко спутать. Так что я сделал это гораздо более конкретным, и все же он продолжает портить. Функция запускается onChange () всякий раз, когда список имен изменяется на исходной странице. Затем он сравнивает новый список имен с зеркальным листом, чтобы определить, что изменилось. Поскольку он сравнивает себя с зеркальным листом, он добавляет или удаляет информацию из зеркального листа.
Он использует цикл, идет к A, находит A на листе зеркала, да? Идет к B, не находит B в зеркальном листе? Добавляет строку к зеркальному листу, добавляет B к зеркальному листу, добавляет выпадающий список в столбце C основного листа строки «B» (я объясню это несколькими предложениями). Начинает цикл снова, а? да. B? да. D? На зеркальном листе есть C, на основном листе нет C. Удалить C из зеркального листа Удалить выпадающий список в столбце C в строке "D". Начинается над A, B, D ... И так далее. При этом он также добавляет и удаляет столбец C из основного листа и помещает его в раскрывающийся список или удаляет его. Но иногда, когда он удаляет раскрывающийся список в столбце C на главном листе, он также удаляет столбец C вплоть до последней строки, но оставляет все выше этого места нетронутым. Я понятия не имею, почему он это делает. Журналы не говорят, что это делает, они говорят, что он получил только один ряд.
Бывают также случаи, когда он добавляет или удаляет отдельные строки, не регистрируя их. Заставить меня думать, что это сбой, когда он удаляет в то же время, что просматривает следующую строку с циклом.
Он должен продолжить процесс цикла, прежде чем он завершит выполнение функции удаления строки. Что-то вроде случайного удержания кнопки удаления, когда она смотрит друг на друга.
Вот код, который даст вам представление о чем я говорю.
function checkAndPlace() {
...'Bunch of ss1 variables'...
var s1 = ss.getActiveSheet();
ss.getRange('F2').setValue('RUNNING')
var Avals = s1.getRange("A1:A").getValues();
var Alast1 = Avals.filter(String).length;
var s1LastRow = s1.getLastRow()+1;
var Sheet1DataRange = s1.getRange(1,1,s1LastRow,1);
var Sheet1BDataRange = s1.getRange(1,2,s1LastRow,1);
var Sheet1Data = Sheet1DataRange.getValues();
var Sheet1BData = Sheet1BDataRange.getValues();
var Sheet1length = Sheet1Data.length;
...'Bunch of ss2 variables'...
var s2 = ss2.getActiveSheet();
var Avals2 = s2.getRange("A1:A").getValues();
var Alast2 = Avals2.filter(String).length;
var s2LastRow = s2.getLastRow()+1;
var Sheet2DataRange = s2.getRange(1,1,s1LastRow,1);
var Sheet2BDataRange = s2.getRange(1,2,s1LastRow,1);
var Sheet2Data = Sheet2DataRange.getValues();
var Sheet2BData = Sheet2BDataRange.getValues();
var Sheet2length = Sheet2Data.length;
for (var i = 0; i < Sheet1Data.length; i++) {
var s1data = Sheet1Data[i][0];
var s1Bdata = Sheet1BData[i][0];
var s2data = Sheet2Data[i][0];
var s2Bdata = Sheet2BData[i][0];
if (s1data + s1Bdata != s2data + s2Bdata){
var falseRow = i+1
var s1falseRowARange = s1.getRange(falseRow,1,1,1);
var s1falseRowAName = s1falseRowARange.getValues();
var s1falseRowBRange = s1.getRange(falseRow,2,1,1);
var s1falseRowBName = s1falseRowBRange.getValues();
var s2falseRowARange = s2.getRange(falseRow,1,1,1);
var s2falseRowAName = s2falseRowARange.getValues();
var s2falseRowBRange = s2.getRange(falseRow,2,1,1);
var s2falseRowBName = s2falseRowBRange.getValues();
for (var j = 0; j < Sheet1Data.length; j++) {
var s1data = Sheet1Data[j][0];
var s1Bdata = Sheet1BData[j][0];
var s2data = Sheet2Data[j][0];
var s2Bdata = Sheet2BData[j][0];
if(s1falseRowAName + s1falseRowBName == s2data + s2Bdata){
var s2trueRow = j+1;
if(falseRow > s2trueRow) {
var fm2t = 'true';
}
else if(falseRow < s2trueRow) {
var fl2t = 'true';
}
var s2Rowfound = 'true';
}
else if(j+1 == s2LastRow && s2Rowfound != 'true'){
var fnot2t = 'true';
}
if(s2falseRowAName + s2falseRowBName == s1data + s1Bdata) {
var s1trueRow = j+1;
if(falseRow > s1trueRow) {
var fm1t = 'true';
}
else if(falseRow < s1trueRow){
var fl1t = 'true';
}
var s1Rowfound = 'true';
}
else if(j+1 == s1LastRow && s1Rowfound != 'true') {
var fnot1t = 'true';
}
if(j+1 == s1LastRow && fnot1t == 'true'){
var falseRow = i+1
...'Bunch of ss2 variables'...
var s2 = ss2.getActiveSheet();
s2.deleteRow(falseRow)
...'Bunch of ss1 variables'...
var s1 = ss.getActiveSheet();
deleteCell('C'+ falseRow)
checkAndPlace()
}
else if(j+1 == s1LastRow && fnot2t == 'true' && fl1t == 'true') {
var falseRow = i+1
...'Bunch of ss1 variables'...
var s1 = ss.getActiveSheet();
var validationList = SpreadsheetApp.newDataValidation().requireValueInList(['Values'], true).build()
insertCell('C' + falseRow)
setValue('C' + falseRow, 'Value')
var SRange = s1.getRange(falseRow,1,1,2);
var A1Range = SRange.getA1Notation();
var SData = SRange.getValues();
...'Bunch of ss2 variables'...
var s2 = ss2.getActiveSheet();
s2.insertRows(falseRow)
s2.getRange(A1Range).setValues(SData);
checkAndPlace()
}
else if(j+1 == s2LastRow && fnot2t == 'true' && fm1t == 'true') {
Logger.log('Don\'t add row '+falseRow+' start from beginning.');
}
else if(j+1 == s1LastRow && fm2t == 'true' && fm1t == 'true') {
Logger.log('How did this happen?!');
}
else if(j+1 == s1LastRow && fm2t == 'true' && fl1t == 'true') {
Logger.log('Chances are someone was added before row '+falseRow+'. Start from beginning.');
checkAndPlace()
}
else if(j+1 == s1LastRow && fl2t == 'true' && fm1t == 'true') {
Logger.log('Chances are someone was deleted before row '+falseRow+'. Start from beginning.');
checkAndPlace()
}
else if(j+1 == s1LastRow && fl2t == 'true' && fl1t == 'true') {
Logger.log('How did this happen?!');
}
}
return false;
}
}
s1.getRange('F2').setValue('')
}
function insertCell(cellRange) {
...'Bunch of ss1 variables'...
var s1 = ss.getActiveSheet();
s1.getRange(cellRange).insertCells(SpreadsheetApp.Dimension.ROWS);
}
function deleteCell(cellRange){
...'Bunch of ss1 variables'...
var s1 = ss.getActiveSheet();
s1.getRange(cellRange).deleteCells(SpreadsheetApp.Dimension.ROWS);
}
Извините, вы должны все это увидеть. Но на всякий случай есть какая-то причина во всем коде, я решил показать это. Я изменил некоторые имена значений, например имена идентификаторов.
Так кто-нибудь знает, как предотвратить "удержание клавиши удаления"? Каким-то образом заставить его взглянуть на функцию if перед удалением следующей строки? Не знаю, как это исправить, и это сводит меня с ума от ощущения, что я ничего не могу сделать, чтобы предотвратить то, что не должно происходить.