Я использую циклы, чтобы просмотреть список имен в одной электронной таблице и сравнить их со списком имен в другой электронной таблице.Если имя существует в Spreadsheet1, но не в Spreadsheet2, оно должно добавить это имя в Spreadsheet2, но если имя в Spreadsheet2 не отображается в Spreadsheet1, оно должно удалить это имя в Spreadsheet2.Идея состоит в том, чтобы заставить их соответствовать друг другу.Чтобы узнать, что меняется, а что нет, чтобы добавить значения в другие ячейки рядом с именами.Он делает это, находя строку, в которой находятся эти различия, а затем просто добавляя или удаляя ячейку в неизменном столбце с найденной строкой.
Тем не менее, выяснить, как это сделать точно, было затруднительно, потому что я хочу, чтобы функция делала это сама, используя функцию onChange (), которая активируется при каждом изменении списка.Список составлен по запросу, полному названий, в алфавитном порядке.Существуют случаи, когда имена добавляются и удаляются из таблицы на расстоянии 1 секунды друг от друга, что вызывает путаницу в отношении того, следует ли удалять или добавлять информацию.
Сначала я просто сравнил длину двух листов, для которых длина больше.Но если имена добавляются и удаляются, сравнение длин является плохой идеей, потому что они могут быть одинаковыми или добавятся, когда должны были быть удалены, и так далее.Все выходит из строя, вот что я говорю.
Поэтому я решил, что более точный, если не более длинный метод - найти строку, не совпадающую на обоих листах «falseRow», как это уже было, и затем получить значение из Spreadsheet1,давайте теперь будем называть это ss1 и ss2.Затем он ищет то же значение в ss2.Если он находит значение, он получает строку в ss2 о том, что он попадает в «trueRow».
Теперь мне все-таки удалось заставить это сделать это, но я не знаю, как заставить его повторяться снова и снова, и после цикла он определяет, не существует ли он вообще.например, если значение в ss1 не может быть найдено в ss2, то оно должно добавить его, или если значение в ss2 не может быть найдено в ss1, то оно должно удалить его.
function checkAndPlace() {
var sos = SpreadsheetApp.openById("Spreadsheet1");
var sas = SpreadsheetApp.setActiveSpreadsheet(sos);
var ss = SpreadsheetApp.getActiveSpreadsheet();
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;
var sos2 = SpreadsheetApp.openById("Spreadsheet2");
var sas2 = SpreadsheetApp.setActiveSpreadsheet(sos2);
var ss2 = SpreadsheetApp.getActiveSpreadsheet();
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,s2LastRow,1);
var Sheet2BDataRange = s2.getRange(1,2,s2LastRow,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];
Logger.log(s1data)
var s1Bdata = Sheet1BData[i][0];
Logger.log(s1Bdata)
var s2data = Sheet2Data[i][0];
Logger.log(s2data)
var s2Bdata = Sheet2BData[i][0];
Logger.log(s2Bdata)
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();
Logger.log('falseRow is '+falseRow+' and its value on Sheet1 is '+s1falseRowAName+' '+s1falseRowBName+' and its value on Sheet2 is '+s2falseRowAName+' '+s2falseRowBName+'.');
Logger.log("Line: "+i+". Sheets are NOT equal. Sheet1 = "+s1data+", Sheet2 = "+s2data);
for (var j = 0; j < Sheet1Data.length; j++) {
var s1data = Sheet1Data[j][0];
Logger.log(s1data)
var s1Bdata = Sheet1BData[j][0];
Logger.log(s1Bdata)
var s2data = Sheet2Data[j][0];
Logger.log(s2data)
var s2Bdata = Sheet2BData[j][0];
Logger.log(s2Bdata)
if(s1falseRowAName + s1falseRowBName == s2data + s2Bdata){
var s2trueRow = j+1
Logger.log(s2trueRow);
if(falseRow > s2trueRow) {
}
else if(falseRow < s2trueRow) {
}
}
else(
Logger.log(s1falseRowAName+' '+s1falseRowBName+' is not on Sheet2. Adding him/her is recommended.')
)
if(s2falseRowAName + s2falseRowBName == s1data + s1Bdata) {
var s1trueRow = j+1
Logger.log(s1trueRow)
if(falseRow > s1trueRow) {
}
else if(falseRow < s1trueRow){
}
}
else(
Logger.log(s2falseRowAName+' '+s2falseRowBName+' is not on Sheet1. Deleting him/her is recommended.')
)
}
return false;
}
}
ss.getRange('F2').setValue('')
}
Прямо сейчасэто все просто логи, пока что не предназначено ничего делать.Но, как вы можете видеть else()
функции в конце обеих if()
функций, которые ищут falseRowNames на других листах.Они будут повторять свои записи в каждом ряду, что они не совпадают.Например: s2falseRowNames.Имя находится на sheet1, но оно будет проходить по всем строкам, говоря, что это не так, пока не найдет правильную строку и не даст строку.Я хочу, чтобы он только сказал, что его нет на листе, если функция if () НИКОГДА не дает ответа.Я не могу просто поместить функцию else()
в if()
, потому что тогда никогда не будет сказано, если функция if()
никогда не имеет ничего =
Как мне это сделать?