Суть - есть много листов на каждом листе в одних и тех же места, это пять диапазонов, где нужно заблокировать изменения строк (изменять может только владелец) таких документов много. Можно както в документе сразу распространить блокировку на все эти диапазоны на всех (нужных) листах. В ручную каждый лист открыть и выделять каждый диапазон выбирать блокировку и так от листа к листу, а потом новый документ и т.д. это какой-то нескончаемый ад))
Суть - есть много листов на каждом листе в одних и тех же места, это пять диапазонов, где нужно заблокировать изменения строк (изменять может только владелец) таких документов много. Можно както в документе сразу распространить блокировку на все эти диапазоны на всех (нужных) листах. В ручную каждый лист открыть и выделять каждый диапазон выбирать блокировку и так от листа к листу, а потом новый документ и т.д. это какой-то нескончаемый ад))g06lins
Массовое создание нескольких защищенных диапазонов на каждом рабочем листе (из заданного списка листов текущего файла) можно выполнить, например, с помощью следующего скрипта: [vba]
Код
function setProtection() { const ss = SpreadsheetApp.getActive(); // массив адресов защищенных диапазонов - для одного листа const rngAddrs = ['A1:E1', 'C7:C22', 'K3:K10', 'F3:F7', 'F20:I20']; // массив имен листов - с именами работать удобнее const sheetNames = ss.getSheets().map(sh => sh.getSheetName()); // вместо получения имен всех имеющихся листов можно задать конкретные нужные - перечислением в массиве
sheetNames.forEach(nm => { // получаем очередной лист как объект по его имени const sh = ss.getSheetByName(nm); // удаляем ранее установленную защиту на эти диапазоны - чтобы не плодились дубли защиты на одни и те же диапазоны const allProtections = sh.getProtections(SpreadsheetApp.ProtectionType.RANGE); allProtections.forEach(pr => { if (~rngAddrs.indexOf(pr.getRange().getA1Notation())) pr.remove() }); // устанавливаем защиту на заданные диапазоны листа rngAddrs.forEach(addr => sh.getRange(addr).protect()); }); }
[/vba]
Массовое создание нескольких защищенных диапазонов на каждом рабочем листе (из заданного списка листов текущего файла) можно выполнить, например, с помощью следующего скрипта: [vba]
Код
function setProtection() { const ss = SpreadsheetApp.getActive(); // массив адресов защищенных диапазонов - для одного листа const rngAddrs = ['A1:E1', 'C7:C22', 'K3:K10', 'F3:F7', 'F20:I20']; // массив имен листов - с именами работать удобнее const sheetNames = ss.getSheets().map(sh => sh.getSheetName()); // вместо получения имен всех имеющихся листов можно задать конкретные нужные - перечислением в массиве
sheetNames.forEach(nm => { // получаем очередной лист как объект по его имени const sh = ss.getSheetByName(nm); // удаляем ранее установленную защиту на эти диапазоны - чтобы не плодились дубли защиты на одни и те же диапазоны const allProtections = sh.getProtections(SpreadsheetApp.ProtectionType.RANGE); allProtections.forEach(pr => { if (~rngAddrs.indexOf(pr.getRange().getA1Notation())) pr.remove() }); // устанавливаем защиту на заданные диапазоны листа rngAddrs.forEach(addr => sh.getRange(addr).protect()); }); }
// вместо получения имен всех имеющихся листов можно задать конкретные нужные - перечислением в массиве
Вот это отличный вариант, пытался понять куда вписывать имена листов, посмотрел в интернете, но так и не смог разобраться в скрипте, к примеру: лист1, лист2, лист3
// вместо получения имен всех имеющихся листов можно задать конкретные нужные - перечислением в массиве
Вот это отличный вариант, пытался понять куда вписывать имена листов, посмотрел в интернете, но так и не смог разобраться в скрипте, к примеру: лист1, лист2, лист3g06lins
Спасибо, получилось! Но получилось что дало доступ к редакции этих диапазонов всем у кого есть доступ к таблице, а нужно чтоб только владелец мог редактировать. Есть конечно вариант, удалить всех из доступа запустить скрипт на блокировку диапазонов, а потом званого вех добавить в доступ. Это если вариантов с скриптом нет.
Спасибо, получилось! Но получилось что дало доступ к редакции этих диапазонов всем у кого есть доступ к таблице, а нужно чтоб только владелец мог редактировать. Есть конечно вариант, удалить всех из доступа запустить скрипт на блокировку диапазонов, а потом званого вех добавить в доступ. Это если вариантов с скриптом нет.g06lins
Сообщение отредактировал g06lins - Пятница, 27.12.2024, 21:30
удалить всех из доступа запустить скрипт на блокировку диапазонов, а потом званого вех добавить в доступ.
Это можно проделать с помощью скрипта, немного переставив операции: сначала поставить защиту на диапазон, а потом удалить всех редакторов из этого диапазона, кроме владельца. Ниже - обновленная версия функции:
[vba]
Код
function setProtection_v2() { const ss = SpreadsheetApp.getActive(); // массив адресов защищенных диапазонов - для одного листа const rngAddrs = ['A1:E1', 'C7:C22', 'K3:K10', 'F3:F7', 'F20:I20']; // массив имен листов - с именами работать удобнее const sheetNames = ['лист1', 'лист2', 'лист3']; // ss.getSheets().map(sh => sh.getSheetName()); // вместо получения имен всех имеющихся листов можно задать конкретные нужные - перечислением в массиве
sheetNames.forEach(nm => { // получаем очередной лист как объект по его имени const sh = ss.getSheetByName(nm);
// удаляем ранее установленную защиту на эти диапазоны - чтобы не плодились дубли защиты на одни и те же диапазоны const allProtections = sh.getProtections(SpreadsheetApp.ProtectionType.RANGE); allProtections.forEach(pr => { if (~rngAddrs.indexOf(pr.getRange().getA1Notation())) pr.remove() });
// устанавливаем защиту на заданные диапазоны листа rngAddrs.forEach(addr => { const protection = sh.getRange(addr).protect();
// ВАЖНО: removeEditors не удаляет ни владельца, ни исполнителя скрипта ("меня") protection.removeEditors(protection.getEditors()); if (protection.canDomainEdit()) { protection.setDomainEdit(false); } }); }); }
[/vba] Обратите внимание, что если этот скрипт раньше запустит НЕвладелец, то диапазоны смогут редактировать два человека: он ("запускатель") и владелец. Но если потом скрипт еще раз запустит владелец, то после этого диапазоны сможет редактировать только он, а у первоначального "запускателя" (НЕвладельца) на эти диапазоны установится режим "Просмотр" (как и у прочих редакторов). Если же первый раз скрипт запустит владелец (как и задумано техпроцессом), то после этого диапазоны сможет редактировать только он. Также после этого попытки других редакторов, для которых установится режим "Просмотр", запустить этот скрипт вызовут ошибки выполнения.
удалить всех из доступа запустить скрипт на блокировку диапазонов, а потом званого вех добавить в доступ.
Это можно проделать с помощью скрипта, немного переставив операции: сначала поставить защиту на диапазон, а потом удалить всех редакторов из этого диапазона, кроме владельца. Ниже - обновленная версия функции:
[vba]
Код
function setProtection_v2() { const ss = SpreadsheetApp.getActive(); // массив адресов защищенных диапазонов - для одного листа const rngAddrs = ['A1:E1', 'C7:C22', 'K3:K10', 'F3:F7', 'F20:I20']; // массив имен листов - с именами работать удобнее const sheetNames = ['лист1', 'лист2', 'лист3']; // ss.getSheets().map(sh => sh.getSheetName()); // вместо получения имен всех имеющихся листов можно задать конкретные нужные - перечислением в массиве
sheetNames.forEach(nm => { // получаем очередной лист как объект по его имени const sh = ss.getSheetByName(nm);
// удаляем ранее установленную защиту на эти диапазоны - чтобы не плодились дубли защиты на одни и те же диапазоны const allProtections = sh.getProtections(SpreadsheetApp.ProtectionType.RANGE); allProtections.forEach(pr => { if (~rngAddrs.indexOf(pr.getRange().getA1Notation())) pr.remove() });
// устанавливаем защиту на заданные диапазоны листа rngAddrs.forEach(addr => { const protection = sh.getRange(addr).protect();
// ВАЖНО: removeEditors не удаляет ни владельца, ни исполнителя скрипта ("меня") protection.removeEditors(protection.getEditors()); if (protection.canDomainEdit()) { protection.setDomainEdit(false); } }); }); }
[/vba] Обратите внимание, что если этот скрипт раньше запустит НЕвладелец, то диапазоны смогут редактировать два человека: он ("запускатель") и владелец. Но если потом скрипт еще раз запустит владелец, то после этого диапазоны сможет редактировать только он, а у первоначального "запускателя" (НЕвладельца) на эти диапазоны установится режим "Просмотр" (как и у прочих редакторов). Если же первый раз скрипт запустит владелец (как и задумано техпроцессом), то после этого диапазоны сможет редактировать только он. Также после этого попытки других редакторов, для которых установится режим "Просмотр", запустить этот скрипт вызовут ошибки выполнения.Gustav