Есть случай, когда тест дается определенному студенту. Студент может работать только с ответом на тест до заданного периода.
Вот примерный случай: https://docs.google.com/spreadsheets/d/1xS3SMrSh2vHCb-ShP96IzzKQGRXYK7ACKO0Ua4_OHOY/edit?usp=sharing
Можно ли автоматически защитить лист или диапазон (в примере это Sheet1!A:B) при выполнении условия?
Например, если ячейка A1 в Sheet2 равна 0, тогда Sheet1 защищен от редактирования кем-либо (кроме меня). Если ячейка A1 в Sheet2 не равна 0, то Sheet1 больше не заблокирован.
Есть ли какая-нибудь формула или скрипт листа Google, который может решить эту проблему?
На самом деле вы можете реализовать это на Простыня, используя Триггер, управляемый временем скрипта приложений. Триггер, управляемый временем, выполняется в определенное время. В вашем случае вы должны использовать Месячный таймер как Тип триггера по времени. Месячный таймер имеет свойства day of month
и time of day
, которые вы можете установить, чтобы определить день и время запуска скрипта.
Следуй этим шагам:
function testFunc(){
var e = {
'day-of-month':16
}
lockUnlockSheet(e)
}
function lockUnlockSheet(e) {
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
if (e['day-of-month'] >= 16) {
var protection = sheet1.protect().setDescription("Protect Sheet1");
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
} else {
sheet1.protect().remove();
}
}
Это должно выглядеть так:
Все готово. Но чтобы протестировать функцию, нам нужна помощь другой функции, чтобы имитировать поведение Trigger. Здесь мы используем testFunc()
.
В редакторе щелкните раскрывающийся список рядом с кнопкой Отлаживать и измените его на testFunc, затем нажмите Бежать.
Если вы установите значение day-of-month
на 16-31, оно заблокирует Sheet1.
Если вы измените его на 1-15, он разблокирует его.
Примечание. Устанавливаемые триггеры всегда запускаются под учетной записью того, кто их создал. getEffectiveUser()
это всегда ты.
Код:
function onEditLock(e) {
var range = e.range;
var sheet = range.getSheet();
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
if (range.getA1Notation() == "A1" && sheet.getName() == "Sheet2") {
if (e.value == 1) {
var protection = sheet1.protect().setDescription("Protect Sheet1");
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
} else if (e.value == 0) {
sheet1.protect().remove();
}
}
}
Настройка триггера:
Выход:
Примечание: onEdit() запускается только тогда, когда пользователь изменяет значение в электронной таблице.
Да, это возможно с триггером onEdit(). Я добавлю образец onEdit() в свой ответ выше.
@RandyAdikara - я обновил свой ответ выше. Дайте мне знать, если это работает.
Большой! Оно работает! Спасибо! Я собираюсь отметить ваш ответ как принятое решение для решения проблемы. Еще одна вещь, это довольно немного из этого дела. Можно ли автоматически блокировать/разблокировать Sheet1, если значение в Sheet2!A1 импортируется из другого файла листа Google? Таким образом, мне не нужно открывать и редактировать все файлы студентов. Таким образом, мне требуется только отредактировать 1 основной файл, после чего значение импортируется с помощью IMPORTRANGE в файл каждого ученика на Sheet2!A1. Возможно, триггер теперь не "на редактирование", а "на изменение". Если возможно, можете ли вы помочь в этом?
@RandyAdikara - Спасибо, что приняли мой ответ. Что касается вашей новой проблемы, я бы предпочел, чтобы вы создали еще один пост с подробной информацией, чтобы сообщество могло лучше понять вашу проблему. Это также даст вам больше шансов получить хорошие ответы.
Предложение работает, но ему не хватает одного. Что мне нужно, так это способ блокировки Sheet1 по условию, которое выполняется в Sheet2!A1. Пока Лист2!А1 равен 0, Лист1 разблокирован. С другой стороны, когда Sheet2!A1 равен 1, тогда Sheet1 заблокирован. Триггер Sheet2!A1 может быть чем угодно (например, я вручную меняю номер), кроме значения триггера времени. Является ли это возможным?