Защита диапазона с помощью сценария приложений занимает слишком много времени

В некотором контексте

  • Я управляю переводами своего веб-приложения, хотя электронная таблица google, на которую я приглашаю переводчиков
  • Есть 30 листов, каждая из которых представляет собой часть приложения (большое приложение).
  • На каждом листе имеется 14 столбцов, 1 столбец/язык.

Что я хочу сделать

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

Как я это сделал

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

Как я сохранил разрешения:

var ProtectionsDefinitions = [{
 langHeader: "en",
 emails: ["[removed_email]"]
},{
 langHeader: "fr",
 emails: ["[removed_email]"]
}
...]

Псевдокод:

For every sheet:
 For every language:
 Protect the column whose header match the langHeader

Реальный код для функции, выполняющей настоящую работу:

function setProtection(range, rangeDesc, emails) {
 // range = class range
 // rangeDesc = string (description for protected range)
 // emails = [[removed_email], [removed_email]]

 var protection = range.protect(); // Creates an object that can protect the range from being edited except by users who have permission. 
 // Until the script actually changes the list of editors for the range
 // the permissions mirror those of the spreadsheet itself, which effectively means that the range remains unprotected.
 protection.removeEditors(protection.getEditors()); // this takes more than 1s ! 
 protection.setDomainEdit(true); // all users in the domain that owns the spreadsheet have permission to edit the protected range
 protection.setDescription(rangeDesc);
 if(emails.length > 0){
 // this takes more than 1s !!
 range.getSheet().getParent().addEditors(emails); // give the users permission to edit the spreadsheet itself, required for protection.addEditors()
 protection.addEditors(emails); // give the users permission to edit the protected range
 }
}

Почему это не удовлетворяет

  • Функция setProtection занимает 2 с для каждого диапазона для защиты
  • У меня 30 листов * 14 столбцов = 420 диапазонов для защиты.
  • Полное выполнение превышает максимальное время, разрешенное скриптом Google Apps (~ 6 минут)

Я проследил строки, которые занимают много раз благодаря инструменту каротажа, см. Комментарии в функции.

Интересно, могу ли я сделать что-то, чтобы заставить его работать.

Пример таблицы

1 ответ

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

Идеи для решений:

Связанные вопросы и ответы

licensed under cc by-sa 3.0 with attribution.