Подскажите пожалуйста. На одном листе создал в столбце список персонала. На другом листе продублировал столбец формулой данный список персонала и добавил к нему еще столбцы графиков отпусков. При удалении сотрудника из основного списка - в дубле удаляется также сотрудник (удаляется ячейка со сдвигом вверх), а остальные столбы остаются на своем месте, чем нарушают весь график отпусков. Что сделать для того, чтобы при удалении сотрудника - в дублирующем списке удалялась вся строка, а не только ячейка со сдвигом вверх. Заранее большое спасибо за ответы.
Добрый день.
Подскажите пожалуйста. На одном листе создал в столбце список персонала. На другом листе продублировал столбец формулой данный список персонала и добавил к нему еще столбцы графиков отпусков. При удалении сотрудника из основного списка - в дубле удаляется также сотрудник (удаляется ячейка со сдвигом вверх), а остальные столбы остаются на своем месте, чем нарушают весь график отпусков. Что сделать для того, чтобы при удалении сотрудника - в дублирующем списке удалялась вся строка, а не только ячейка со сдвигом вверх. Заранее большое спасибо за ответы.oxidia
Это общее описание алгоритма, основанного на принципах каскадного удаления записей в больших взрослых БД, согласно которым сначала удаляются записи из подчиненной таблицы, а затем из главной. При этом подразумевается транзакционность всего процесса, согласно которой либо выполнятся все (обе) операции, либо не выполнится ни одна. Выполнение только одной из них и невыполнение другой переводит систему в неконсистентное (несогласованное) состояние, с нарушением целостности данных, что есть нехорошо.
А как последовательно выполнить эти две операции - это уже дело второе. Можно вручную, а можно несложным скриптом: [vba]
Код
// предполагаем, что на обоих листах списки находятся в колонке A // перед запуском скрипта встаем на первом листе в ячейку колонки A, которую хотим удалить из списка
function deleteElementFromList() { var ss = SpreadsheetApp.getActive();
var rng = ss.getActiveRange(); // ячейка, которую будем удалять из списка var val = rng.getValue(); // ее значение (для поиска на втором листе) SpreadsheetApp.flush();
var sheet2 = ss.getSheetByName('Лист2'); var values = sheet2.getRange('A:A').getValues().map((v) => { return v[0] }); SpreadsheetApp.flush();
var pos = values.indexOf(val) + 1; if (pos) sheet2.deleteRow(pos); // удаляем всю строку на втором листе
rng.deleteCells(SpreadsheetApp.Dimension.ROWS); // удаляем элемент списка на первом листе // "транзакция" закончена }
Это общее описание алгоритма, основанного на принципах каскадного удаления записей в больших взрослых БД, согласно которым сначала удаляются записи из подчиненной таблицы, а затем из главной. При этом подразумевается транзакционность всего процесса, согласно которой либо выполнятся все (обе) операции, либо не выполнится ни одна. Выполнение только одной из них и невыполнение другой переводит систему в неконсистентное (несогласованное) состояние, с нарушением целостности данных, что есть нехорошо.
А как последовательно выполнить эти две операции - это уже дело второе. Можно вручную, а можно несложным скриптом: [vba]
Код
// предполагаем, что на обоих листах списки находятся в колонке A // перед запуском скрипта встаем на первом листе в ячейку колонки A, которую хотим удалить из списка
function deleteElementFromList() { var ss = SpreadsheetApp.getActive();
var rng = ss.getActiveRange(); // ячейка, которую будем удалять из списка var val = rng.getValue(); // ее значение (для поиска на втором листе) SpreadsheetApp.flush();
var sheet2 = ss.getSheetByName('Лист2'); var values = sheet2.getRange('A:A').getValues().map((v) => { return v[0] }); SpreadsheetApp.flush();
var pos = values.indexOf(val) + 1; if (pos) sheet2.deleteRow(pos); // удаляем всю строку на втором листе
rng.deleteCells(SpreadsheetApp.Dimension.ROWS); // удаляем элемент списка на первом листе // "транзакция" закончена }