Google Sheets: исключить строку текущей даты из защиты - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть таблица в Google Sheets в формате:

ABC

Дата спроса на товарные запасы

День2 Дата2 на товарном спросе

и т. Д.

Остальные обязаны заполнять инвентарь и требовать каждый день.Тем не менее, они должны только заполнить спрос и инвентарь текущего дня.Им также не разрешается изменять предыдущие данные или заранее заполнять запасы и спрос в последующие дни.Поэтому я хочу защитить весь лист от редактирования другими, кроме строки с текущей датой.Например, сегодня (23.09) они должны иметь возможность редактировать строку, где B - 23.09.2019 и ничего больше.

Может кто-нибудь помочь мне?Спасибо.

1 Ответ

0 голосов
/ 23 сентября 2019

Рабочий процесс может быть следующим:

  • Перебрать все строки листа, сравнивая дату в столбце B с сегодняшним днем ​​
  • Вернуть индекс строки с сегодняшней датой
  • Снимите все существующие защиты листа
  • Создайте защиту , которая защищает весь лист, за исключением строки, содержащей сегодняшнюю дату с setUnprotectedRanges

Образец:

function myFunction() {
 var sheet=SpreadsheetApp.getActive().getActiveSheet();
 var range=sheet.getDataRange();
 var values=range.getValues();
 var today=new Date();
 today.setHours(0);
 today.setMinutes(0);
 today.setSeconds(0);
 today.setMilliseconds(0);
 var todayMs=today.getTime();
  for(var i=0;i<values.length;i++){
    var date=values[i][1];
    var dateMs=date.getTime();
    if(dateMs==todayMs){
      var row=i+1;
      break;
    }
  }  
  var protections=sheet.getProtections(SpreadsheetApp.ProtectionType.SHEET); 
 for (var i = 0; i < protections.length; i++) {
  var protection = protections[i];
  if (protection.canEdit()) {
    protection.remove();
   } 
 } 
 var myProtection = sheet.protect().setDescription('Sample protected range'); 
 var rangeToday=sheet.getRange(row, 1, 1, sheet.getLastColumn());
 myProtection.setUnprotectedRanges([rangeToday]);
 myProtection.removeEditors(myProtection.getEditors());
}

Примечание. Этот код выходит из цикла после нахождения первой строки, содержащей сегодняшнюю дату.Если у вас несколько строк с одной и той же датой, вам нужно изменить код, преобразовав row в массив, который может содержать различные записи.

...