es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo retrasar la protección de la celda cuando se introduce un valor en ella?

He utilizado el siguiente código de activador OnEdit() para bloquear una celda después de ingresar datos por primera vez:

 function LockCells(event){

  var range = event.range;

  var description = 'Protegido';   // + stringDate;
  var protection = range.protect().setDescription(description);

  var me = Session.getEffectiveUser();
  protection.addEditor(me);
  protection.removeEditors(protection.getEditors());

  if (protection.canDomainEdit()) {
  protection.setDomainEdit(false);
}

}

Y cuando ingreso un valor en una celda como usuario (no como administrador de la hoja), bloquea instantáneamente la celda para no poder volver a ingresar un valor. ¿Podemos retrasar este proceso? ¿Quiero decir, si ingresamos un valor ahora pero la protección en esa celda se aplica después de 10 minutos o una hora pero no inmediatamente?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, podemos retrasar el proceso de bloquear celdas después de ingresar los datos por primera vez utilizando la función setTimeBasedTrigger() en Google Apps Script. Podemos modificar el código existente del disparador OnEdit() para crear un disparador basado en tiempo que se ejecuta después de un tiempo específico, como 10 minutos o una hora, y bloquea la celda. Aquí hay un ejemplo de código para hacerlo:

    function onEdit(event) {
      var sheet = event.range.getSheet();
      var cell = event.range;
      var description = 'Protegido';
      var protection = cell.protect().setDescription(description);
    
      // Añadir editor y quitar todos los otros editores
      var me = Session.getEffectiveUser();
      protection.addEditor(me);
      protection.removeEditors(protection.getEditors());
    
      if (protection.canDomainEdit()) {
        protection.setDomainEdit(false);
      }
    
      // Crear un disparador basado en tiempo para bloquear la celda después de 10 minutos
      ScriptApp.newTrigger("bloquearCelda")
        .timeBased()
        .after(10 * 60 * 1000) // 10 minutos en milisegundos
        .create();
    }
    
    function bloquearCelda() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var cell = sheet.getActiveCell();
    
      // Comprobar si la celda ya está bloqueada
      if (!cell.isProtected()) {
        var description = 'Protegido';
        var protection = cell.protect().setDescription(description);
    
        // Añadir editor y quitar todos los otros editores
        var me = Session.getEffectiveUser();
        protection.addEditor(me);
        protection.removeEditors(protection.getEditors());
    
        if (protection.canDomainEdit()) {
          protection.setDomainEdit(false);
        }
      }
    }
    

    En este código modificado, usamos el método ScriptApp.newTrigger() para crear un disparador basado en tiempo que ejecuta la función bloquearCelda() después de 10 minutos, como se especifica en el método .after(). Esta función verifica si la celda ya está bloqueada y, si no lo está, aplica la misma configuración de protección que antes.

    Puede modificar el código para cambiar el tiempo de retraso a cualquier duración que desee, como una hora o dos horas. Para hacer esto, simplemente reemplace la duración de tiempo en milisegundos en el método .after() con el valor deseado.

    Nota: Al usar el método setTimeBasedTrigger(), asegúrese de autorizar que el script se ejecute como usuario haciendo clic en el botón Revisar permisos y otorgando los permisos necesarios.

Comments are closed.