Как применить защищенные диапазоны ко всем пользователям в таблицах Google?

У меня есть код, который делает то, что я хочу, но у меня есть одна проблема. По сути, приведенный ниже код создает защищенный диапазон, когда ячейка в столбце AC не пуста, и удаляет ее, когда она пуста. Код работает при редактировании.

Он работает хорошо, но проблема в том, что даже если строка защищена, каждый может ее редактировать, и я понятия не имею, как ее отключить. Есть ли у кого-нибудь идеи, что может быть не так с моим кодом?

function CellProtection2(e) {
var sheet = e.source.getActiveSheet();
  var range = e.range;
  var row = range.getRow();
  var column = range.getColumn();

  // Check if the edited cell is in column AC
  if (column == 29) { // Assuming AC is the 29th column
    var cellValue = range.getValue();
    
    // Get the range from column B to W for the edited row
    var rowRange = sheet.getRange(row, 2, 1, 23); // B2:W2 for the first row
    
    if (cellValue !== "") {
      // If AC column is not empty, protect the range from B to W in the row
      var protection = rowRange.protect().setDescription('Protected because AC column has a value');
      
      // Remove all editors
      var editors = protection.getEditors();
      for (var i = 0; i < editors.length; i++) {
        protection.removeEditor(editors[i]);
      }

      // Disable domain editing
      if (protection.canDomainEdit()) {
        protection.setDomainEdit(false);
      }
      
    } else {
      // If AC column is empty, remove protection from the range
      var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
      for (var i = 0; i < protections.length; i++) {
        var protectionRange = protections[i].getRange();
        if (protectionRange && protectionRange.getA1Notation() == rowRange.getA1Notation()) {
          protections[i].remove();
        }
      }
    }
  }
}

Что касается the problem is that even if the row is protected everyone can still edit the row, если ваша функция CellProtection2 установлена ​​в качестве триггера OnEdit, например, при редактировании ячейки «AC2» ячейки «B2:X2» защищаются. И эти ячейки не может редактировать только владелец электронной таблицы. Другие пользователи не могут редактировать ячейки. Могу ли я спросить вас о связи между этой ситуацией и вашей текущей проблемой?

Tanaike 29.05.2024 01:37

«Код работает при редактировании». Пожалуйста, уточните: эта функция вызывается простым триггером или устанавливаемым триггером? Кто создал устанавливаемый триггер? Если вы используете устанавливаемый триггер, как вы гарантируете, что только один пользователь создаст устанавливаемый триггер?

Wicket 29.05.2024 02:47

только когда владелец электронной таблицы введет что-то в столбец AC, это нельзя будет редактировать, но если это сделает любой другой пользователь, тогда можно будет редактировать

Timonek 29.05.2024 03:00

@Wicket вызывается простым триггером «функция onEdit(e)»

Timonek 29.05.2024 03:08

@Timonek Когда я увидел ваш скрипт, я подумал, что функция CellProtection2 was installed as the installable OnEdit trigger. But, from it вызывается простым триггером 'function onEdit(e)', if you call the function CellProtection2` из function onEdit(e), это и есть причина вашей текущей проблемы. Пожалуйста, переименуйте onEdit в installedOnEdit, установите триггер OnEdit в installedOnEdit и проверьте его еще раз. Я думаю, что, конечно, можно напрямую использовать CellProtection2. Но я не могу знать весь ваш сценарий. Итак, я предложил вышеописанное.

Tanaike 29.05.2024 03:49

@Tanaike Я попробовал, но все равно не работает...

Timonek 29.05.2024 04:54

Спасибо за ответ. По поводу @Tanaike I have tried it and it still not working..., в этом случае требуется правильно воспроизвести вашу ситуацию. Потому что, когда я тестировал ваш сценарий, я не смог воспроизвести вашу проблему, упомянутую в моем первом комментарии. Я прошу прощения за это. Но мне бы хотелось вас поддержать. Итак, можете ли вы предоставить подробный порядок действий для правильного воспроизведения вашей текущей проблемы? Этим я хотел бы это подтвердить.

Tanaike 29.05.2024 05:01

@Tanaike Думаю, я получил ответ на этот вопрос. На панели действий только люди, находящиеся на вкладке «Совместный доступ», могут использовать ее и фактически защищать диапазон. Люди, находящиеся на вкладке «Просмотрщики», даже если введут что-то в столбец AC и создадут защищенный диапазон, каждый сможет это изменить.

Timonek 29.05.2024 09:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
8
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В Google Таблицах невозможно применить защиту, блокирующую всех пользователей, поскольку владелец таблицы всегда сможет редактировать любой защищенный лист или диапазон.

При использовании сценария для создания, обновления или удаления средств защиты, чтобы заблокировать всех пользователей, кроме владельца электронной таблицы, убедитесь, что сценарий запускается владельцем электронной таблицы или устанавливаемым триггером, созданным владельцем электронной таблицы.

Если проект Google Apps Script содержится в электронной таблице, которую необходимо защитить, то проще создать триггер «вручную», а не с помощью кода с помощью веб-приложения Google Apps Script. Подробности можно найти на странице https://developers.google.com/apps-script/guides/triggers/installable.

Убедитесь, что функция, вызываемая устанавливаемым триггером, не вызывается дважды одним и тем же событием, т. е. это может произойти при использовании простого триггера и устанавливаемого триггера для одного и того же события, например, при редактировании.

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

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

Похожие вопросы

Триггер Google Apps Script OnChange() срабатывает только тогда, когда изменения вносятся только на Лист 1
Как создавать пункты меню в Google Таблицах с помощью несвязанных скриптов?
Могу ли я изменить эту формулу, чтобы она отслеживала дату начала и окончания вместо списка дат в столбце?
Изменение размера графика в Google Таблицах на основе видимых столбцов
Цикл «For» работает только один раз в Apps Script для таблиц Google
Arrayfomula с фильтром по всему столбцу
Как создать динамический VSTACK, состоящий из массивов, сформированных с помощью MAKEARRAY в Google Sheets
Скрипт приложений, использующий данные из Таблиц, не может быть отправлен из учетной записи Gmail без каких-либо ошибок
Google Sheet – сложная формула для выравнивания декартова произведения в одном столбце
Как запустить функцию onEdit/onChange в скрипте Google Apps для данных, полученных динамически с помощью запроса