Защита листа, за исключением сегодняшних строк
Я взял код, с которым вы связались, из pkowalczyk и изменил его, чтобы защитить весь лист, кроме строки, предназначенной длясегодня.Большая часть этого кода также доступна в документации здесь .
//https://developers.google.com/apps-script/reference/spreadsheet/protection#setUnprotectedRanges(Range)
//https://stackoverflow.com/a/43828395/7215091
function unlockTodaysRowFromSheetProtection() {
var ss = SpreadsheetApp.getActive();
var sh = ss.getSheetByName('ProtectRows');
var protection=sh.protect().setDescription('Protected Sheet');
protection.getRange().setBackground('#ffffff');
var rg = sh.getRange(2,1,sh.getLastRow()-1,1);
var vA = rg.getValues();
var today = new Date();
var todayRow = null;
for (var i=0; i<vA.length; i++) {
if (today.isSameDateAs(vA[i][0])) {
todayRow = i;
break;
}
}
var rangeToUnProtect = sh.getRange(todayRow + 2,1,1,sh.getLastColumn());
protection.setUnprotectedRanges([rangeToUnProtect]);
protection.getRange().setBackground('#ffff00');//highlight protected range
rangeToUnProtect.setBackground('#00ffff');//highlight unprotected range
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
protection.addEditor('email@gmail.com'); // second person with edit permissions
}
Этот раздел взят из Кстати , и вы можете обратиться к нему для более подробного объяснения.«Это» относится к сегодняшнему дню в коде и сравнивает год, месяц и день.
/*
http://stackoverflow.com/a/4428396/2351523
*/
Date.prototype.isSameDateAs = function(pDate) {
return (
this.getFullYear() === pDate.getFullYear() &&
this.getMonth() === pDate.getMonth() &&
this.getDate() === pDate.getDate()
);
}
Это был интересный вопрос, поскольку я не очень часто использовал защиту.Мне показалось удобным иметь боковую панель защищенных листов и диапазонов во время выполнения кода.Я выделил защищенные и незащищенные диапазоны только для того, чтобы понять, что они из себя представляют.
Попытка снять защиту более чем с одной строки
Это должно помочь.Он собирает все диапазоны для снятия защиты в массиве и снимает защиту одновременно.
function unprotectTodaysRowsFromSheetProtection() {
var ss = SpreadsheetApp.getActive();
var sh = ss.getSheetByName('ProtectRows');
var protection=sh.protect().setDescription('Protected Sheet');
protection.getRange().setBackground('#ffffff');
var rg = sh.getRange(2,1,sh.getLastRow()-1,1);
var vA = rg.getValues();
var today = new Date();
var uprgA=[];
for (var i=0; i<vA.length; i++) {
if (today.isSameDateAs(vA[i][0])) {
uprgA.push(sh.getRange(i + 2,1,1,sh.getLastColumn()))
}
}
protection.setUnprotectedRanges(uprgA);
protection.getRange().setBackground('#ffff00');
for(var i=0;i<uprgA.length;i++){
uprgA[i].setBackground('#00ffff');
}
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
protection.addEditor('email@gmail.com'); // second person with edit permissions
}