Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Создание защищенного диапазона в Google таблицах - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Создание защищенного диапазона в Google таблицах
g06lins Дата: Четверг, 26.12.2024, 10:44 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 40% ±

Суть - есть много листов на каждом листе в одних и тех же места, это пять диапазонов, где нужно заблокировать изменения строк (изменять может только владелец) таких документов много. Можно както в документе сразу распространить блокировку на все эти диапазоны на всех (нужных) листах. В ручную каждый лист открыть и выделять каждый диапазон выбирать блокировку и так от листа к листу, а потом новый документ и т.д. это какой-то нескончаемый ад))
 
Ответить
СообщениеСуть - есть много листов на каждом листе в одних и тех же места, это пять диапазонов, где нужно заблокировать изменения строк (изменять может только владелец) таких документов много. Можно както в документе сразу распространить блокировку на все эти диапазоны на всех (нужных) листах. В ручную каждый лист открыть и выделять каждый диапазон выбирать блокировку и так от листа к листу, а потом новый документ и т.д. это какой-то нескончаемый ад))

Автор - g06lins
Дата добавления - 26.12.2024 в 10:44
Gustav Дата: Четверг, 26.12.2024, 16:09 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2821
Репутация: 1190 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Массовое создание нескольких защищенных диапазонов на каждом рабочем листе (из заданного списка листов текущего файла) можно выполнить, например, с помощью следующего скрипта:
[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]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеМассовое создание нескольких защищенных диапазонов на каждом рабочем листе (из заданного списка листов текущего файла) можно выполнить, например, с помощью следующего скрипта:
[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]

Автор - Gustav
Дата добавления - 26.12.2024 в 16:09
g06lins Дата: Четверг, 26.12.2024, 20:50 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 40% ±

Спасибо!
// вместо получения имен всех имеющихся листов можно задать конкретные нужные - перечислением в массиве  

Вот это отличный вариант, пытался понять куда вписывать имена листов, посмотрел в интернете, но так и не смог разобраться в скрипте, к примеру: лист1, лист2, лист3
 
Ответить
СообщениеСпасибо!
// вместо получения имен всех имеющихся листов можно задать конкретные нужные - перечислением в массиве  

Вот это отличный вариант, пытался понять куда вписывать имена листов, посмотрел в интернете, но так и не смог разобраться в скрипте, к примеру: лист1, лист2, лист3

Автор - g06lins
Дата добавления - 26.12.2024 в 20:50
Gustav Дата: Пятница, 27.12.2024, 01:16 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2821
Репутация: 1190 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
пытался понять куда вписывать имена листов

В 4-й строке задан массив адресов диапазонов. Для имен листов (строка 6) можно аналогично - в квадратных скобках и через запятую между ними:
[vba]
Код
const sheetNames = ['лист1', 'лист2', 'лист3'];
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
пытался понять куда вписывать имена листов

В 4-й строке задан массив адресов диапазонов. Для имен листов (строка 6) можно аналогично - в квадратных скобках и через запятую между ними:
[vba]
Код
const sheetNames = ['лист1', 'лист2', 'лист3'];
[/vba]

Автор - Gustav
Дата добавления - 27.12.2024 в 01:16
g06lins Дата: Пятница, 27.12.2024, 21:11 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 40% ±

Спасибо, получилось!
Но получилось что дало доступ к редакции этих диапазонов всем у кого есть доступ к таблице, а нужно чтоб только владелец мог редактировать.
Есть конечно вариант, удалить всех из доступа запустить скрипт на блокировку диапазонов, а потом званого вех добавить в доступ.
Это если вариантов с скриптом нет.


Сообщение отредактировал g06lins - Пятница, 27.12.2024, 21:30
 
Ответить
СообщениеСпасибо, получилось!
Но получилось что дало доступ к редакции этих диапазонов всем у кого есть доступ к таблице, а нужно чтоб только владелец мог редактировать.
Есть конечно вариант, удалить всех из доступа запустить скрипт на блокировку диапазонов, а потом званого вех добавить в доступ.
Это если вариантов с скриптом нет.

Автор - g06lins
Дата добавления - 27.12.2024 в 21:11
Gustav Дата: Суббота, 28.12.2024, 13:25 | Сообщение № 6
Группа: Админы
Ранг: Участник клуба
Сообщений: 2821
Репутация: 1190 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
удалить всех из доступа запустить скрипт на блокировку диапазонов, а потом званого вех добавить в доступ.

Это можно проделать с помощью скрипта, немного переставив операции: сначала поставить защиту на диапазон, а потом удалить всех редакторов из этого диапазона, кроме владельца. Ниже - обновленная версия функции:

[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]
Обратите внимание, что если этот скрипт раньше запустит НЕвладелец, то диапазоны смогут редактировать два человека: он ("запускатель") и владелец. Но если потом скрипт еще раз запустит владелец, то после этого диапазоны сможет редактировать только он, а у первоначального "запускателя" (НЕвладельца) на эти диапазоны установится режим "Просмотр" (как и у прочих редакторов). Если же первый раз скрипт запустит владелец (как и задумано техпроцессом), то после этого диапазоны сможет редактировать только он. Также после этого попытки других редакторов, для которых установится режим "Просмотр", запустить этот скрипт вызовут ошибки выполнения.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
удалить всех из доступа запустить скрипт на блокировку диапазонов, а потом званого вех добавить в доступ.

Это можно проделать с помощью скрипта, немного переставив операции: сначала поставить защиту на диапазон, а потом удалить всех редакторов из этого диапазона, кроме владельца. Ниже - обновленная версия функции:

[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
Дата добавления - 28.12.2024 в 13:25
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!