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

Вход

Регистрация

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

 

= Мир MS Excel/Защита ячеек от повторного ввода даных в Google таблицах -2 - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Защита ячеек от повторного ввода даных в Google таблицах -2
ivanovcdek Дата: Среда, 23.06.2021, 18:54 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Добрый день!
По мотивам поста 6ти летней давности (уж извините) в паралельном форуме http://www.excelworld.ru/forum/23-16677-1

По сути мне нужно реализовать очень похожую штуку, а именно...

Необходимо реализовать скрипт, который будет автоматически защищать ячейку в диапазоне A:I от редактирование любым пользователем (в т.ч. не авторизованным, т.к. документ открыт с условием "Редактировать могут все у кого есть ссылка") и при этом наделять правами редактирования одного конкретного пользователя "email@gmail.com"

В файле "пример" попытался переделать скрипт из вышеуказанного форума под свои задачи.

Получилось очень коряво (я к сожалению в этом не разбираюсь, но сделать по аналогии иногда могу), поэтому не судите строго за размер скрипта.

[vba]
Код
function onEdit(e){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = e.range;

var Column = range.getColumn();
var Row = range.getRow();

if (sheet.getRange("A"+Row).getValue() != '') {
var RangeProtection = sheet.getRange("A"+Row);
var User = Session.getEffectiveUser();

var protection = RangeProtection.protect().setDescription('Protected ' + Row);
protection.addEditor(User);
protection.removeEditors(protection.getEditors());

if (sheet.getRange("B"+Row).getValue() != '') {
var RangeProtection = sheet.getRange("B"+Row);
var User = Session.getEffectiveUser();

var protection = RangeProtection.protect().setDescription('Protected ' + Row);
protection.addEditor(User);
protection.removeEditors(protection.getEditors());

if (sheet.getRange("C"+Row).getValue() != '') {
var RangeProtection = sheet.getRange("C"+Row);
var User = Session.getEffectiveUser();

if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
}
}
}
};
[/vba]
Однако получившийся скрипт работает в одностороннем порядке: если я как владелец доки меняю значение, то ячейка защищается, а если я это делаю как не авторизованный пользователь, то ничего не происходит - другой не авторизованный пользователь так же может редактировать).

Именно эту "односторонность" и необходимо убрать.

Подскажите (желательно примером) можно ли реализовать такую автозащиту на всех пользователей, в т.ч. не авторизованных?


Сообщение отредактировал ivanovcdek - Среда, 23.06.2021, 18:56
 
Ответить
СообщениеДобрый день!
По мотивам поста 6ти летней давности (уж извините) в паралельном форуме http://www.excelworld.ru/forum/23-16677-1

По сути мне нужно реализовать очень похожую штуку, а именно...

Необходимо реализовать скрипт, который будет автоматически защищать ячейку в диапазоне A:I от редактирование любым пользователем (в т.ч. не авторизованным, т.к. документ открыт с условием "Редактировать могут все у кого есть ссылка") и при этом наделять правами редактирования одного конкретного пользователя "email@gmail.com"

В файле "пример" попытался переделать скрипт из вышеуказанного форума под свои задачи.

Получилось очень коряво (я к сожалению в этом не разбираюсь, но сделать по аналогии иногда могу), поэтому не судите строго за размер скрипта.

[vba]
Код
function onEdit(e){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = e.range;

var Column = range.getColumn();
var Row = range.getRow();

if (sheet.getRange("A"+Row).getValue() != '') {
var RangeProtection = sheet.getRange("A"+Row);
var User = Session.getEffectiveUser();

var protection = RangeProtection.protect().setDescription('Protected ' + Row);
protection.addEditor(User);
protection.removeEditors(protection.getEditors());

if (sheet.getRange("B"+Row).getValue() != '') {
var RangeProtection = sheet.getRange("B"+Row);
var User = Session.getEffectiveUser();

var protection = RangeProtection.protect().setDescription('Protected ' + Row);
protection.addEditor(User);
protection.removeEditors(protection.getEditors());

if (sheet.getRange("C"+Row).getValue() != '') {
var RangeProtection = sheet.getRange("C"+Row);
var User = Session.getEffectiveUser();

if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
}
}
}
};
[/vba]
Однако получившийся скрипт работает в одностороннем порядке: если я как владелец доки меняю значение, то ячейка защищается, а если я это делаю как не авторизованный пользователь, то ничего не происходит - другой не авторизованный пользователь так же может редактировать).

Именно эту "односторонность" и необходимо убрать.

Подскажите (желательно примером) можно ли реализовать такую автозащиту на всех пользователей, в т.ч. не авторизованных?

Автор - ivanovcdek
Дата добавления - 23.06.2021 в 18:54
Kashimirush Дата: Четверг, 24.06.2021, 09:36 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
Все дело в триггере onEdit() - он может мало чего, вам нужно функцию переписать как пользовательскую функцию (myFunction()) и поставить триггер из меню триггеров редактора скриптов, на редактирование таблицы.
e.range - работать соответственно не будет, нужно будет обращаться к активной колонке через getActiveRange()


Работа, работа, перейди на Федота...

Сообщение отредактировал Kashimirush - Четверг, 24.06.2021, 09:37
 
Ответить
СообщениеВсе дело в триггере onEdit() - он может мало чего, вам нужно функцию переписать как пользовательскую функцию (myFunction()) и поставить триггер из меню триггеров редактора скриптов, на редактирование таблицы.
e.range - работать соответственно не будет, нужно будет обращаться к активной колонке через getActiveRange()

Автор - Kashimirush
Дата добавления - 24.06.2021 в 09:36
ivanovcdek Дата: Четверг, 24.06.2021, 16:45 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Kashimirush, Спасибо. Вроде поменял onEdit() на myFunction(), поставил триггер, поменял e.range на getActiveRange()

Сначала даже в столбце А начали автоматом защищаться ячейки. Начал прописывать по аналогии для других столюцов, но сломалось все. теперь и для А не защищаются ячейки. Что я делаю нет так? Точнее, как сделать правильно?
 
Ответить
СообщениеKashimirush, Спасибо. Вроде поменял onEdit() на myFunction(), поставил триггер, поменял e.range на getActiveRange()

Сначала даже в столбце А начали автоматом защищаться ячейки. Начал прописывать по аналогии для других столюцов, но сломалось все. теперь и для А не защищаются ячейки. Что я делаю нет так? Точнее, как сделать правильно?

Автор - ivanovcdek
Дата добавления - 24.06.2021 в 16:45
Kashimirush Дата: Понедельник, 28.06.2021, 11:58 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
Что я делаю нет так?


Вы пытаетесь делать дело, в котором не разбираетесь и даже не хотите прочитать документацию или базовые уроки по скриптам, которых на ютубе полно. getActiveRange() вы применили не правильно.
Я ведь вам даже код подправил и дал подсказки в комментариях, вы зачем то вернули все как было. По-моему вам лучше обратиться в платную ветку...
К сообщению приложен файл: 6909268.jpg (71.2 Kb)


Работа, работа, перейди на Федота...
 
Ответить
Сообщение
Что я делаю нет так?


Вы пытаетесь делать дело, в котором не разбираетесь и даже не хотите прочитать документацию или базовые уроки по скриптам, которых на ютубе полно. getActiveRange() вы применили не правильно.
Я ведь вам даже код подправил и дал подсказки в комментариях, вы зачем то вернули все как было. По-моему вам лучше обратиться в платную ветку...

Автор - Kashimirush
Дата добавления - 28.06.2021 в 11:58
ivanovcdek Дата: Вторник, 29.06.2021, 09:29 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Kashimirush, Спасибо, ваш "волшебный пендель" и картинка сделали свое дело =) у меня получилось.
 
Ответить
СообщениеKashimirush, Спасибо, ваш "волшебный пендель" и картинка сделали свое дело =) у меня получилось.

Автор - ivanovcdek
Дата добавления - 29.06.2021 в 09:29
  • Страница 1 из 1
  • 1
Поиск:

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