Почему защита от радиуса действия занимает так много времени

#google-apps-script #google-sheets

Вопрос:

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

Похоже, требуется очень много времени, чтобы добавить человека в зону защиты. Я использовал регистратор, чтобы выяснить, что занимает так много времени, и, похоже, protection.addEditor() занимает 27700 мс, а protection.removeEditors() занимает 21904 мс. Это нормально?

Рабочая книга совместно используется группой из 30 человек, в ней около 60 листов, а всего в рабочей книге содержится около 300 000 ячеек.

Есть какие-нибудь идеи, почему это занимает так много времени?

Я получаю ошибку: Исключение: Время ожидания электронных таблиц службы истекло при доступе к документу с идентификатором …. Это происходит не каждый раз при запуске сценария, но когда это происходит, это всегда происходит в том месте, где я защищаю ячейку. Я запускаю ночной процесс для поиска новых записей и защиты этих ячеек, чтобы только указанное лицо могло редактировать. Он используется в качестве системы бронирования смен.

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

 function protectActiveCell() {    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();  var bookCell = sheet.getCurrentCell();  var name = bookCell.getValue();  var person = getPersonFromName(name);  var email = person.email;  *emphasized text*var others = getOtherUsersEmails(email);    removeCellProtection(bookCell);   var protection = bookCell.protect();    SpreadsheetApp.flush();    protection.addEditor(email);   protection.removeEditors(others);    SpreadsheetApp.flush();   }    function removeCellProtection(cell) {    // Remove range protections from specific cell.    var sheet = cell.getSheet();   var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);    for (var i = 0; i lt; protections.length; i  ) {   var protection = protections[i];   if (protection.getRange().getA1Notation() == cell.getA1Notation()) {   protection.remove();   SpreadsheetApp.flush();  }  } }  

Комментарии:

1. Означает ли это, что у вас фактически есть 300 тысяч защищенных диапазонов, которые вы просматриваете каждый раз?

2. Каждый вечер около 250 000 ячеек эффективно сканируются, возвращая таблицу ячеек с записями. В результате получится всего 5000 ячеек. Если защита соответствует названию, ничего не происходит.