Защита диапазонов на основе определенных значений - PullRequest
1 голос
/ 01 ноября 2019

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

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

Например - Пользователь1 с электронной почтой: email1@google.com может редактировать только строку 8: 8, и только он, я и никто другой.

spreadsheet

Я получил ошибку.

function zakresychronione() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var ochronadanych = ss.getSheetByName('Dyspozycje')
  var p1 = ochronadanych.getRange('8:8').protect();
  var p1val = ochronadanych.getRange('E8').getValue()
      p1.remove()
      p1.addEditor(p1val)}

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

Ответы [ 4 ]

0 голосов
/ 08 ноября 2019

Да, большое спасибо. Из-за тебя я понял петли. Я использовал твои сценарии, они потрясающие и помогли мне создать то, что я хочу. ,Но была только одна проблема: каждый раз, когда я редактировал электронную почту, скрипт создавал следующий защищенный диапазон с реальным пользователем. Когда я добавил новое электронное письмо в пустую ячейку, он создал два защищенных диапазона - один, который позволял редактировать диапазон только мне, и другой, который позволял редактировать диапазон для меня и этого электронного письма. Я пытался понять почему, но я не знаю. Я решил изменить все ваши сценарии, и теперь это здорово. Я использовал его, чтобы удалить защиту и создать новую, и я создал строку состояния, которая показывает, сколько диапазонов защиты необходимо создать, например, 4/35, 5/35 и т. Д. Я не буду часто обновлять защиту, так что все в порядке. Спасибо всем и особенно Ямблиху.

С уважением, Себастьян

0 голосов
/ 02 ноября 2019

Вот пример цикла, и я удаляю p1.remove ():

function zakresychronione() {
  var ss= SpreadsheetApp.getActive();
  var ochronadanych = ss.getSheetByName('Dyspozycje')

  var lstRow=ochronadanych.getLastRow();
  for (i=8;i<lstRow+1;i++)
  {
    var p1 = ochronadanych.getRange(i + ':' + i).protect();
    var p1val = ochronadanych.getRange('E' + i).getValue()
    p1.addEditor(p1val);
  }
}
0 голосов
/ 04 ноября 2019

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

Учитывая это, я написал некоторый код, который выполняет следующие действия:

Каждый раз, когда электронное письмо редактируется(столбец 5, индекс строки больше 7), защита для этой конкретной строки должна быть обновлена. Единственными редакторами для этой строки будут вы (измените свой адрес электронной почты соответствующим образом в коде) и лицо, адрес электронной почты которого совпадает с адресом, указанным в ячейке:

function onEdit(e) {
  var editedRange = e.range; // Range that was edited (info coming from event object)
  var sheetName = 'Dyspozycje';
  var sheet = e.source.getSheetByName(sheetName);
  var column = 5;
  // Getting edited cell column and row index
  var editedCol = editedRange.getColumn();
  var editedRow = editedRange.getRow();
  // Checking the edited cell corresponds to an email
  if(editedRow > 7 && editedCol == column) { 
    var numCols = sheet.getMaxColumns();
    // Row that needs protection update
    var range = sheet.getRange(editedRow, 1, 1, numCols);
    // Creating protection
    var protection = range.protect().setDescription(editedRow);
    // Getting emails from desired editors
    var me = 'your_email@domain.com'; // Change accordingly
    var email = sheet.getRange(editedRow, editedCol).getValue();
    // Remove previous editors
    protection.removeEditors(protection.getEditors());
    // Add desired editors
    protection.addEditors([me, email]);
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }
  }
}

Кроме того, поскольку сначала защита не будет установлена, запустите это один раз, чтобы установить их для каждой строки (после этого не будет необходимости запускать это; защита будет обновляться автоматически благодаря триггеру onEdit):

function createProtections() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getDataRange().getValues();
  var emailColumn = 5;
  for(var i = 8; i < values.length; i++) {
    var numCols = sheet.getMaxColumns();
    var range = sheet.getRange(i, 1, 1, numCols);
    var protection = range.protect().setDescription(i);
    var me = Session.getEffectiveUser().getEmail();
    var email = sheet.getRange(i, emailColumn).getValue();
    protection.removeEditors(protection.getEditors());
    protection.addEditors([me, email]);
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }   
  }
}

Я надеюсь, что этолюбая помощь.

0 голосов
/ 02 ноября 2019

Больше информации о проблеме:

[19-11-02 02:06:23:553 PDT] Starting execution
[19-11-02 02:06:23:576 PDT] SpreadsheetApp.getActiveSpreadsheet() [0.016 seconds]
[19-11-02 02:06:23:638 PDT] SpreadsheetApp.Spreadsheet.getSheetByName([Dyspozycje]) [0.062 seconds]
[19-11-02 02:06:23:639 PDT] SpreadsheetApp.Sheet.getRange([8:8]) [0 seconds]
[19-11-02 02:06:24:306 PDT] SpreadsheetApp.Range.protect() [0.666 seconds]
[19-11-02 02:06:24:307 PDT] SpreadsheetApp.Sheet.getRange([E8]) [0 seconds]
[19-11-02 02:06:24:512 PDT] SpreadsheetApp.Range.getValue() [0.205 seconds]
[19-11-02 02:06:24:513 PDT] SpreadsheetApp.Protection.remove() [0 seconds]
[19-11-02 02:06:24:873 PDT] SpreadsheetApp.Protection.addEditor([tychy.polnoc@gmail.com]) [0.359 seconds]
[19-11-02 02:06:25:304 PDT] Execution failed: Błąd usługi: Arkusze kalkulacyjne (line 7, file "makra") [1.393 seconds total runtime]

Странно то, что когда я пишу это письмо в сценарии вручную, все работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...