¿Cómo puedo obtener el valor antiguo de una celda cuando el usuario elimina el contenido?

El propósito de esto es evitar la eliminación / edición accidental cuando los usuarios novatos usan una hoja de cálculo compartida. Solo las celdas vacías deben actualizarse sin una advertencia.

Funciona al editar el contenido de la celda. Pero al eliminar el contenido de la celda, oldValue no está definido: la celda tenía contenido.

PD. Sé que esto solo funciona para ediciones de celda única: tuve una verificación para el ancho / alto del rango == 1, pero eso tampoco es cierto para una eliminación de valor. (seleccione celda, presione eliminar)

Mi código de prueba a continuación:

function onEdit(e) {
  Logger.log("onEdit called") 
  Logger.log("e.oldValue: %s", e.oldValue) 
  Logger.log("e.value: %s", e.value)
  Logger.log(e) 
  if (!("value" in e) || (e.oldValue != undefined)) {
     if (shouldRevertChange(e.oldValue, e.range.getValue())) {
        e.range.setValue(e.oldValue);
     }
   }
}

function shouldRevertChange(oldValue, newValue) {
  var ui = SpreadsheetApp.getUi();

  var result = ui.alert(
     'Was this a mistake?',
    'You changed the contents of a cell. Old value: '+oldValue+', new value: '+newValue+'. Do you want to revert the change?',
      ui.ButtonSet.YES_NO);

  // Process the user's response.
  if (result == ui.Button.YES) {
    // User clicked "Yes".
    return true;
  } else {
    // User clicked "No" or X in the title bar.
    return false;
  }
}

Aquí está mi hoja de prueba, editable: Ampliación de imagen. -0 / edit? Usp = compartir

También prueba script: https://script.google.com/d/1IuTpeEDlsqjDyp3ADRy2JYKzDymR7zOpPkamIcEUHnHXUNdA0SRf7xyU/edit?usp=sharing

Necesito ver en el mensaje de alerta, el valor anterior de la celda eliminada.

Mensaje para el valor de edición: Alerta de usuario Registros del valor de edición: ingrese la descripción de la imagen aquí

Mensaje para borrar / borrar valor: ingrese la descripción de la imagen aquí

Registros para eliminar / borrar el valor (el valor de la celda anterior no está en ninguna parte): ingrese la descripción de la imagen aquí

7
Alex 26 nov. 2018 a las 09:23

3 respuestas

La mejor respuesta

Hay un complemento que logrará esto por usted. Toma la ruta de crear una hoja de cálculo oculta que refleje la real.

https://gist.github.com/tanaikech/73edaed1268a6d07118aed538aa5608d

2
AnonymousSB 9 dic. 2018 a las 11:08
    function onEdit(e){
        e.range.setNote(e.oldValue);
        e.range.setValue(e.range.getNote());
        e.range.clearNote();
    }

La función anterior utiliza la 'Insertar nota' en la función de celda de las hojas de Google como una variable de retención temporal. Una copia del valor anterior de la celda se copia como una nota, restablece el valor editado de la celda y la nota se elimina. Este código no verifica específicamente si el usuario presionó la tecla 'Eliminar'. Reemplaza cualquier edición realizada en la celda con e.oldValue.

Para verificar específicamente si el usuario presionó la tecla 'Eliminar' y restablecer la celda a e.oldValue, la función se puede cambiar a:

    function onEdit(e){
        if(e.value == null) 
        e.range.setValue(e.oldValue);
    }

Nota: Las hojas protegidas a través de Apps Script son susceptibles de ediciones realizadas a través de la aplicación de teléfono Google Sheets. En tales situaciones, puede ser necesario utilizar fórmulas celulares. Sheet1 se puede usar para recibir la entrada del usuario. Sheet2 es un espejo de Sheet1 y está bloqueado para edición solo por el propietario. Yo uso la siguiente fórmula en la celda D5 de Sheet2:

    =IF(LEN(Sheet1!D5)=0,"Please enter valid input",Sheet1!D5)

El usuario debe verificar Sheet2 para la salida generada en base a la entrada dada.

1
Dharman 22 may. 2020 a las 08:52

Use la línea inferior para obtener el valor anterior en la función Editar

var oldValue = e.oldValue ? e.oldValue : null;
0
Rahul 3 sep. 2019 a las 11:47