#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 ячеек. Если защита соответствует названию, ничего не происходит.