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

Вход

Регистрация

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

 

= Мир MS Excel/Автоматическое закрытие доступа к ячейкам. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Автоматическое закрытие доступа к ячейкам.
Pozka Дата: Четверг, 02.03.2023, 09:45 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 20% ±

Добрый день. Заранее извиняюсь, если данная тема уже была где-то поднята, по крайней мере я не нашел.
Есть задача: Имеем документ таблица в гугл доке. К ней открыт доступ по ссылке всем. Требуется, чтоб ее могли редактировать только в определенное время.
Написал два небольших скрипта, один закрывает доступ к диапазону ячеек, другой к ним же открывает. У листа появляется, что этот диапазон защищен и только я могу редактировать информацию. Но по факту закрытый диапазон может редактировать кто угодно. Подскажите, что я делаю не так. Или другой способ это сделать.
Текст скриптов:[vba]
Код
/** @OnlyCurrentDoc */
function SetPotectionLD() {
var spreadsheet = SpreadsheetApp.getActive();
var range = spreadsheet.getRange('B2:Z95');
// @ts-ignore
var protection = range.protect().setDescription('Защита листа');
};

function RemPotectionLD() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('B2:Z95').activate();
var allProtections = spreadsheet.getActiveSheet().getProtections(SpreadsheetApp.ProtectionType.RANGE);
var matchingProtections = allProtections.filter(function(existingProtection) {
return existingProtection.getRange().getA1Notation() == 'B2:Z95';
});
var protection = matchingProtections[0];
protection.remove();
};
[/vba]


Сообщение отредактировал Serge_007 - Четверг, 02.03.2023, 11:23
 
Ответить
СообщениеДобрый день. Заранее извиняюсь, если данная тема уже была где-то поднята, по крайней мере я не нашел.
Есть задача: Имеем документ таблица в гугл доке. К ней открыт доступ по ссылке всем. Требуется, чтоб ее могли редактировать только в определенное время.
Написал два небольших скрипта, один закрывает доступ к диапазону ячеек, другой к ним же открывает. У листа появляется, что этот диапазон защищен и только я могу редактировать информацию. Но по факту закрытый диапазон может редактировать кто угодно. Подскажите, что я делаю не так. Или другой способ это сделать.
Текст скриптов:[vba]
Код
/** @OnlyCurrentDoc */
function SetPotectionLD() {
var spreadsheet = SpreadsheetApp.getActive();
var range = spreadsheet.getRange('B2:Z95');
// @ts-ignore
var protection = range.protect().setDescription('Защита листа');
};

function RemPotectionLD() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('B2:Z95').activate();
var allProtections = spreadsheet.getActiveSheet().getProtections(SpreadsheetApp.ProtectionType.RANGE);
var matchingProtections = allProtections.filter(function(existingProtection) {
return existingProtection.getRange().getA1Notation() == 'B2:Z95';
});
var protection = matchingProtections[0];
protection.remove();
};
[/vba]

Автор - Pozka
Дата добавления - 02.03.2023 в 09:45
Gustav Дата: Пятница, 03.03.2023, 15:31 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Здравствуйте! Попробуйте такую комбинацию, предварительно удалив вручную ранее созданные защиты для этого диапазона:
[vba]
Код
/** @OnlyCurrentDoc */

function removeProtection() {
    var spreadsheet = SpreadsheetApp.getActive();
    var allProtections = spreadsheet.getActiveSheet().getProtections(SpreadsheetApp.ProtectionType.RANGE);
    var matchingProtections = allProtections.filter(function(existingProtection) {
        return existingProtection.getDescription() == 'Защита Каро-Канн';
    });
    matchingProtections.forEach(function(protection) {
        protection.remove();
    });
};

function setProtection() {
    removeProtection();
    var spreadsheet = SpreadsheetApp.getActive();
    var range = spreadsheet.getRange('B2:Z95');
    var protection = range.protect();  
    protection.setDescription('Защита Каро-Канн');

    var me = Session.getEffectiveUser();  
    protection.addEditor(me);
    // ВАЖНО: removeEditors не удаляет ни владельца, ни исполнителя скрипта (меня)
    protection.removeEditors(protection.getEditors());
    if (protection.canDomainEdit()) {
        protection.setDomainEdit(false);
    }        
};
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеЗдравствуйте! Попробуйте такую комбинацию, предварительно удалив вручную ранее созданные защиты для этого диапазона:
[vba]
Код
/** @OnlyCurrentDoc */

function removeProtection() {
    var spreadsheet = SpreadsheetApp.getActive();
    var allProtections = spreadsheet.getActiveSheet().getProtections(SpreadsheetApp.ProtectionType.RANGE);
    var matchingProtections = allProtections.filter(function(existingProtection) {
        return existingProtection.getDescription() == 'Защита Каро-Канн';
    });
    matchingProtections.forEach(function(protection) {
        protection.remove();
    });
};

function setProtection() {
    removeProtection();
    var spreadsheet = SpreadsheetApp.getActive();
    var range = spreadsheet.getRange('B2:Z95');
    var protection = range.protect();  
    protection.setDescription('Защита Каро-Канн');

    var me = Session.getEffectiveUser();  
    protection.addEditor(me);
    // ВАЖНО: removeEditors не удаляет ни владельца, ни исполнителя скрипта (меня)
    protection.removeEditors(protection.getEditors());
    if (protection.canDomainEdit()) {
        protection.setDomainEdit(false);
    }        
};
[/vba]

Автор - Gustav
Дата добавления - 03.03.2023 в 15:31
Pozka Дата: Среда, 15.03.2023, 14:40 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 20% ±

Спасибо, сработало.
 
Ответить
СообщениеСпасибо, сработало.

Автор - Pozka
Дата добавления - 15.03.2023 в 14:40
Pozka Дата: Пятница, 21.04.2023, 10:55 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 20% ±

Gustav, Спасибо еще раз на помощь. Возникла еще одна проблема. Сам скрипт работает нормально. Но попробовал на него навесить триггер, чтоб выполнялся по времени в определенный день, и он перестал выполнятся. Точнее при ручном запуске все работает, а по таймеру нет. Хотя пишет, что выполнился успешно и ошибок не показывает.
 
Ответить
СообщениеGustav, Спасибо еще раз на помощь. Возникла еще одна проблема. Сам скрипт работает нормально. Но попробовал на него навесить триггер, чтоб выполнялся по времени в определенный день, и он перестал выполнятся. Точнее при ручном запуске все работает, а по таймеру нет. Хотя пишет, что выполнился успешно и ошибок не показывает.

Автор - Pozka
Дата добавления - 21.04.2023 в 10:55
Gustav Дата: Суббота, 22.04.2023, 03:10 | Сообщение № 5
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
при ручном запуске все работает, а по таймеру нет. Хотя пишет, что выполнился успешно и ошибок не показывает

При выполнении триггера по таймеру в закрытой таблице ссылки типа spreadsheet.getActiveSheet() и spreadsheet.getRange('B2:Z95') будут относиться к ПЕРВОМУ рабочему листу (если только Вы предварительно не использовали в коде activate() для листа или диапазона).

Первый лист - это тот лист, к которому Вы хотите применить защиту? Т.е. может так получиться, что скрипт триггера работает без ошибок, но защищает совсем не тот лист, который Вы хотели. Лучше вместо getActiveSheet() ссылаться на конкретный лист, например, с помощью getSheetByName().


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
при ручном запуске все работает, а по таймеру нет. Хотя пишет, что выполнился успешно и ошибок не показывает

При выполнении триггера по таймеру в закрытой таблице ссылки типа spreadsheet.getActiveSheet() и spreadsheet.getRange('B2:Z95') будут относиться к ПЕРВОМУ рабочему листу (если только Вы предварительно не использовали в коде activate() для листа или диапазона).

Первый лист - это тот лист, к которому Вы хотите применить защиту? Т.е. может так получиться, что скрипт триггера работает без ошибок, но защищает совсем не тот лист, который Вы хотели. Лучше вместо getActiveSheet() ссылаться на конкретный лист, например, с помощью getSheetByName().

Автор - Gustav
Дата добавления - 22.04.2023 в 03:10
Pozka Дата: Среда, 26.04.2023, 10:57 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 20% ±

Gustav, Спасибо. Не подумал о том, что сто скрипт не поймет к какому листу обращаться. Нужный лит действительно не первый. Добавил с помощью getSheetByName() ссылку на конкретный лист и все заработало.
 
Ответить
СообщениеGustav, Спасибо. Не подумал о том, что сто скрипт не поймет к какому листу обращаться. Нужный лит действительно не первый. Добавил с помощью getSheetByName() ссылку на конкретный лист и все заработало.

Автор - Pozka
Дата добавления - 26.04.2023 в 10:57
  • Страница 1 из 1
  • 1
Поиск:

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