Блокировать лист, когда дата в столбце> 24 часа: Google Sheets - Scripteditor? - PullRequest
0 голосов
/ 26 октября 2018

Чтобы предотвратить потерю данных другими участниками, я хотел бы заблокировать весь лист для всех данных <сегодня. </p>

Сегодня должна быть возможность делать ввод и вносить изменения в записи.

Простой пример мастер-файла: ПРИМЕР - LOCK <СЕГОДНЯ </a>

Таким образом, каждая строка будет заблокирована для других, когда дата в столбце A <сегодня. </p>

Эта ссылка приблизила меня, но у меня проблемы с

var range = ss.getRange ('1: 1'). GetValues ​​() [0];

, что приводит к ошибке в строке 31: «ОШИБКА ТИПА: не удается найти функцию getFullYear в объекте ...»

Открыт для любой другой идеи / кода.

Заранее спасибо за помощь!

Qni

1 Ответ

0 голосов
/ 26 октября 2018

Защита листа, за исключением сегодняшних строк

Я взял код, с которым вы связались, из 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...