Нет необходимости, чтобы скрипт перебирал все строки каждый раз, когда необходимо обновить защиту. Вы можете создать триггер 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);
}
}
}
Я надеюсь, что этолюбая помощь.