Защитить лист, когда условие выполнено путем изменения (Google Sheet)

Есть случай, когда тест дается определенному студенту. Студент может работать только с ответом на тест до заданного периода.

Вот примерный случай: https://docs.google.com/spreadsheets/d/1xS3SMrSh2vHCb-ShP96IzzKQGRXYK7ACKO0Ua4_OHOY/edit?usp=sharing

  1. Sheet1!A:A - это место, где задаются вопросы
  2. Sheet1!B:B - это место, где ученик должен написать ответ.
  3. Sheet2!A1 — это условие для защиты или снятия защиты Sheet1. Когда дата после 15-го числа, эта ячейка становится 1, в противном случае она остается 0. Эта ячейка изменяется автоматически, поскольку она содержит формулу СЕГОДНЯ().
  4. Когда Sheet2!A1 изменяется на 1, Sheet1!A:B необходимо защитить от редактирования кем-либо, кроме владельца файла.

Можно ли автоматически защитить лист или диапазон (в примере это Sheet1!A:B) при выполнении условия?

Например, если ячейка A1 в Sheet2 равна 0, тогда Sheet1 защищен от редактирования кем-либо (кроме меня). Если ячейка A1 в Sheet2 не равна 0, то Sheet1 больше не заблокирован.

Есть ли какая-нибудь формула или скрипт листа Google, который может решить эту проблему?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле вы можете реализовать это на Простыня, используя Триггер, управляемый временем скрипта приложений. Триггер, управляемый временем, выполняется в определенное время. В вашем случае вы должны использовать Месячный таймер как Тип триггера по времени. Месячный таймер имеет свойства day of month и time of day, которые вы можете установить, чтобы определить день и время запуска скрипта.

Пример:

Следуй этим шагам:

  1. Скопируйте и вставьте приведенный ниже код в редактор кода и сохраните.
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();
    }
}
  1. Вставив код, нажмите Сохранять
  2. Перейдите на вкладку Триггеры в вашем редакторе (находится в левой части редактора с символом будильника)
  3. Нажмите Добавить триггер
  4. Скопируйте конфигурацию триггера ниже (у вас должно быть сгенерировано 2 триггера)

Это должно выглядеть так:

Все готово. Но чтобы протестировать функцию, нам нужна помощь другой функции, чтобы имитировать поведение Trigger. Здесь мы используем testFunc().

В редакторе щелкните раскрывающийся список рядом с кнопкой Отлаживать и измените его на testFunc, затем нажмите Бежать.

Если вы установите значение day-of-month на 16-31, оно заблокирует Sheet1.

Если вы измените его на 1-15, он разблокирует его.

Примечание. Устанавливаемые триггеры всегда запускаются под учетной записью того, кто их создал. getEffectiveUser() это всегда ты.


Обновление: использование триггера onEdit

Код:

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() запускается только тогда, когда пользователь изменяет значение в электронной таблице.

Рекомендации:

Предложение работает, но ему не хватает одного. Что мне нужно, так это способ блокировки Sheet1 по условию, которое выполняется в Sheet2!A1. Пока Лист2!А1 равен 0, Лист1 разблокирован. С другой стороны, когда Sheet2!A1 равен 1, тогда Sheet1 заблокирован. Триггер Sheet2!A1 может быть чем угодно (например, я вручную меняю номер), кроме значения триггера времени. Является ли это возможным?

Randy Adikara 06.05.2022 06:40

Да, это возможно с триггером onEdit(). Я добавлю образец onEdit() в свой ответ выше.

Nikko J. 06.05.2022 07:00

@RandyAdikara - я обновил свой ответ выше. Дайте мне знать, если это работает.

Nikko J. 06.05.2022 07:15

Большой! Оно работает! Спасибо! Я собираюсь отметить ваш ответ как принятое решение для решения проблемы. Еще одна вещь, это довольно немного из этого дела. Можно ли автоматически блокировать/разблокировать Sheet1, если значение в Sheet2!A1 импортируется из другого файла листа Google? Таким образом, мне не нужно открывать и редактировать все файлы студентов. Таким образом, мне требуется только отредактировать 1 основной файл, после чего значение импортируется с помощью IMPORTRANGE в файл каждого ученика на Sheet2!A1. Возможно, триггер теперь не "на редактирование", а "на изменение". Если возможно, можете ли вы помочь в этом?

Randy Adikara 06.05.2022 08:57

@RandyAdikara - Спасибо, что приняли мой ответ. Что касается вашей новой проблемы, я бы предпочел, чтобы вы создали еще один пост с подробной информацией, чтобы сообщество могло лучше понять вашу проблему. Это также даст вам больше шансов получить хорошие ответы.

Nikko J. 06.05.2022 09:08

Другие вопросы по теме