https://docs.google.com/spreads....1150569 На листе Список Спусков оператор вводит дату в столбце Дата спуска Выбирает из выпадающего списка Заказчик Имя заказчика Ставит флажок рядом.
Скрипт: Узнает Номер Заказчика на листе Заказчик по имени выбранного на листе Список Спусков Заказчика. Значение соответствующего счетчика на листе Заказчик увеличивает на 1. (Изначально все счетчики равны 0). на листе Список Спусков в выделенной строке с нажатым флажком в колонке Номер Спуска формирует номер: Номер Заказчика-Счетчик-Дата.
После этого блокирует флажок.
Номера должны быть 3-значными (кроме даты). 001-001-070623
https://docs.google.com/spreads....1150569 На листе Список Спусков оператор вводит дату в столбце Дата спуска Выбирает из выпадающего списка Заказчик Имя заказчика Ставит флажок рядом.
Скрипт: Узнает Номер Заказчика на листе Заказчик по имени выбранного на листе Список Спусков Заказчика. Значение соответствующего счетчика на листе Заказчик увеличивает на 1. (Изначально все счетчики равны 0). на листе Список Спусков в выделенной строке с нажатым флажком в колонке Номер Спуска формирует номер: Номер Заказчика-Счетчик-Дата.
После этого блокирует флажок.
Номера должны быть 3-значными (кроме даты). 001-001-070623egorus
Сообщение отредактировал egorus - Среда, 07.06.2023, 19:40
Предложил свой вариант листа "Заказчик" (см. в своем файле лист "Заказчик (Gustav)"). С нормальными (нетекстовыми) форматами колонок, и с такой саморасширяющейся формулой генерации начала номера монтажа (в ячейке D1): [vba]
[/vba] Скрипту останется взять начало номера, дописать дату, после чего увеличить на 1 значение в колонке "Счетчик последний использованный" (сейчас, в начале жизненного цикла, там пустые ячейки). Чуть позже займусь самим скриптом.
Предложил свой вариант листа "Заказчик" (см. в своем файле лист "Заказчик (Gustav)"). С нормальными (нетекстовыми) форматами колонок, и с такой саморасширяющейся формулой генерации начала номера монтажа (в ячейке D1): [vba]
[/vba] Скрипту останется взять начало номера, дописать дату, после чего увеличить на 1 значение в колонке "Счетчик последний использованный" (сейчас, в начале жизненного цикла, там пустые ячейки). Чуть позже займусь самим скриптом.Gustav
var range = SpreadsheetApp.getActive().getActiveRange(); // чтобы придать тип Range переменной - для появления списка методов по точке range = e.range; // а здесь просто переопределяем var sheet = SpreadsheetApp.getActive().getActiveSheet(); // чтобы придать тип Sheet переменной - для появления списка методов по точке sheet = range.getSheet(); // а здесь просто переопределяем
switch (sheet.getSheetName()) { case 'Список Монтажей': if (range.getColumn() == sheet.getRange('E:E').getColumn() && range.getRow() >= 2) { // читаем текущую запись var avalCurrRecord = sheet.getRange(range.getRow(),1,1,5).getValues(); // определяем поля по отдельности - для удобства дальнейшего програмирования var currCustomer = avalCurrRecord[0][0]; // поле Заказчик var currDate = avalCurrRecord[0][1]; // поле Дата спуска var currNumber = avalCurrRecord[0][2]; // поле Номер монтажа var currCheckbox = avalCurrRecord[0][4]; // поле Установить номер (флажок)
// номер монтажа будет сгенерирован и заполнен по новой, если: // - флажок "Установить номер" устанавливается (если снимается, то ничего не будет), и при этом: // - поле "Номер монтажа" НЕ заполнено (если оно заполнено старым кодом, то очистить вручную) // - поля "Заказчик" и "Дата спуска" заполнены if (currCheckbox == true && !currNumber && currDate && currCustomer) { sheet.getRange(range.getRow(),3).setValue(getMountNumber(currCustomer, currDate)); SpreadsheetApp.flush(); } else { Browser.msgBox("Что-то не заполнено или Флажок - снимается или Номер уже существует"); } } break; } }
function getMountNumber(custName, launchDate) {
// получаем доступ к рабочему листу со справочником var ss = SpreadsheetApp.getActive(); var shtCustomer = ss.getSheetByName('Заказчик (Gustav)');
// читаем данные с него в общий массив var avalCustomer = shtCustomer.getDataRange().getValues();
// и по наимемнованию заказчика находим его позицию в списке (строку) var mapCustomer = avalCustomer.map(v => v[1]); var idx = mapCustomer.indexOf(custName); var counter = avalCustomer[idx][2];
// увеличиваем счетчик на 1 и сохраняем в таблице shtCustomer.getRange(idx+1,3).setValue(Number(counter)+1); SpreadsheetApp.flush();
// окончательно формируем номер монтажа для запрошенного заказчика и даты return avalCustomer[idx][3] + Utilities.formatDate(launchDate, ss.getSpreadsheetTimeZone, "ddMMyy"); }
[/vba] Пока без каких-либо блокировок. Номер заполняется во время установки флажка, во время снятия - ничего не происходит. Если номер уже заполнен, то новый номер не генерируется (чтобы сгенерировался - нужно сначала очистить вручную). Разумеется, должны быть заполнены поля "Заказчик" и "Дата спуска". Результатом выполнения скрипта является либо заполнение поля "Номер монтажа", либо сообщение о том, что "что-то не так", т.е. какая-то реакция будет всегда.
Закатил по ссылке такой скриптовый код: [vba]
Код
function onEdit(e) {
var range = SpreadsheetApp.getActive().getActiveRange(); // чтобы придать тип Range переменной - для появления списка методов по точке range = e.range; // а здесь просто переопределяем var sheet = SpreadsheetApp.getActive().getActiveSheet(); // чтобы придать тип Sheet переменной - для появления списка методов по точке sheet = range.getSheet(); // а здесь просто переопределяем
switch (sheet.getSheetName()) { case 'Список Монтажей': if (range.getColumn() == sheet.getRange('E:E').getColumn() && range.getRow() >= 2) { // читаем текущую запись var avalCurrRecord = sheet.getRange(range.getRow(),1,1,5).getValues(); // определяем поля по отдельности - для удобства дальнейшего програмирования var currCustomer = avalCurrRecord[0][0]; // поле Заказчик var currDate = avalCurrRecord[0][1]; // поле Дата спуска var currNumber = avalCurrRecord[0][2]; // поле Номер монтажа var currCheckbox = avalCurrRecord[0][4]; // поле Установить номер (флажок)
// номер монтажа будет сгенерирован и заполнен по новой, если: // - флажок "Установить номер" устанавливается (если снимается, то ничего не будет), и при этом: // - поле "Номер монтажа" НЕ заполнено (если оно заполнено старым кодом, то очистить вручную) // - поля "Заказчик" и "Дата спуска" заполнены if (currCheckbox == true && !currNumber && currDate && currCustomer) { sheet.getRange(range.getRow(),3).setValue(getMountNumber(currCustomer, currDate)); SpreadsheetApp.flush(); } else { Browser.msgBox("Что-то не заполнено или Флажок - снимается или Номер уже существует"); } } break; } }
function getMountNumber(custName, launchDate) {
// получаем доступ к рабочему листу со справочником var ss = SpreadsheetApp.getActive(); var shtCustomer = ss.getSheetByName('Заказчик (Gustav)');
// читаем данные с него в общий массив var avalCustomer = shtCustomer.getDataRange().getValues();
// и по наимемнованию заказчика находим его позицию в списке (строку) var mapCustomer = avalCustomer.map(v => v[1]); var idx = mapCustomer.indexOf(custName); var counter = avalCustomer[idx][2];
// увеличиваем счетчик на 1 и сохраняем в таблице shtCustomer.getRange(idx+1,3).setValue(Number(counter)+1); SpreadsheetApp.flush();
// окончательно формируем номер монтажа для запрошенного заказчика и даты return avalCustomer[idx][3] + Utilities.formatDate(launchDate, ss.getSpreadsheetTimeZone, "ddMMyy"); }
[/vba] Пока без каких-либо блокировок. Номер заполняется во время установки флажка, во время снятия - ничего не происходит. Если номер уже заполнен, то новый номер не генерируется (чтобы сгенерировался - нужно сначала очистить вручную). Разумеется, должны быть заполнены поля "Заказчик" и "Дата спуска". Результатом выполнения скрипта является либо заполнение поля "Номер монтажа", либо сообщение о том, что "что-то не так", т.е. какая-то реакция будет всегда.Gustav