有一个表格,其中有许多工作表。一些单元格填充了值,一些单元格填充了公式。需要阻止更改包含公式的单元格。它们需要仅对有限数量的用户可用。我设法编写了此脚本,但它运行速度不快。有什么方法可以加快它吗?
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);
}
}
}
}
}
}
我尝试直接在protections数组中使用命名范围或分配阻塞范围,但在这种情况下,我的代码出现错误,无法完全工作。
1条答案
按热度按时间67up9zun1#
一般来说,我发现改变方法。我块不是单独的范围,而是整个工作表。没有公式的单元格,这应该增加到变化,存储在一个数组中。我把这个数组作为排除范围的清单块。与这种方法,它证明了快得多。