Как ускорить работу скрипта в гугл таблицах?
Есть таблица в которой много листов. Часть ячеек заполнена значениями, часть - формулами. Требуется заблокировать ячейки с формулам от изменений. Нужно чтобы они были доступны для изменений только ограниченному кругу пользователей. Мне удалось написать этот скрипт, но он работает не быстро. Есть ли какие-то способы его ускорить?
function myFunction2() {
const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for(const sheeto of sheets) { //проводим перебор всех листов
var ss1 = sheeto.getName();
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(ss1);
var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) { //удаляем имеющиеся блокировки при наличии
var protection = protections[i];
if (protection.canEdit()) {
protection.remove();
}
}
var arr2 = ss.getDataRange().getFormulas();
var numRows = arr2.length-1;
var numCols = arr2[0].length-1;
for (var i = 0; i <= numCols; ++i) {
for (var y = 0; y <= numRows; ++y) {
if (arr2[y][i]!="") { //блокируем все с формулами
var range = ss.getRange(y+1,i+1);
var protection = range.protect().setDescription('автозащита');
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.addEditor('пользователь1');
protection.addEditor('пользователь2');
protection.addEditor('пользователь3');
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
}
}
}
}
}
Ответы (1 шт):
Автор решения: 404
→ Ссылка
в общем решила сменить подход. Блокирую не отдельно диапазоны, а весь лист. Ячейки без формул, которые должны быть доступны к изменениям, сохраняю в массив. И этот массив передаю в блокировку листа в качестве диапазонов-исключений. При таком подходе получается гораздо быстрее.
function myFunction2() {
const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for(const sheeto of sheets) {
var ss1 = sheeto.getName();
if (ss1!="Лист1" ) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(ss1);
var arr2 = ss.getDataRange().getFormulas();
var numRows = arr2.length-1;
var numCols = arr2[0].length-1;
var Range1 = new Array(0);
var Range2 = new Array(0);
var Range3 = new Array(1);
vyh: {
for (var i = 3; i <= numRows; ++i) {
for (var y = 3; y <= numCols; ++y) {
if (arr2[i][y]!="") {
}
else{
yy=y+1
ii=i+1
Range1.length=Range1.length+1
Range1[Range1.length-1]=yy
Range2.length=Range2.length+1
Range2[Range2.length-1]=ii
}
}
}
}
Range3[0]=col2A1(Range1[0]) + Range2[0]
ii=1
f=0
for (var i = 1; i <= Range1.length-1; ++i){
if (Range2[i]==Range2[i-1] && Range1[i-1]==Range1[i]-1) {
if (f==0) {
Range3[ii-1] = Range3[ii-1] + ":" + col2A1(Range1[i]) + Range2[i]
f=1
}
else{
Range3[ii-1]=Range3[ii-1].slice(0, Range3[ii-1].indexOf(":")) + ":" + col2A1(Range1[i]) + Range2[i]
}
}
else {
Range3[ii]=col2A1(Range1[i]) + Range2[i]
ii=ii+1
f=0
}
}
var protection = ss.protect().setDescription('автозащита листа');
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
var protection = ss.protect();
var unprotected = protection.getUnprotectedRanges();
for (var i = 0; i <= Range3.length-1; ++i){
unprotected.push(ss.getRange(Range3[i]));
protection.setUnprotectedRanges(unprotected);
}
}
}
}
function col2A1(col){
let result = "";
let base = 27;
while(col>0){
let newLetter = String.fromCharCode("A".charCodeAt(0)+(col-1)%(base-1));
result=newLetter + result;
col = (col - col%base) / base;
};
return result;
};