
Tengo una hoja de cálculo que necesita un sello de fecha para cada fila tan pronto como se realicen cambios en las celdas dentro de esa fila. Por ejemplo, cambio algo en la celda B14, E14 o G14 y la fecha de hoy aparece en K14. Obviamente, necesito poder elegir el rango de filas y columnas que se verán afectadas.
Sin embargo, lo complicado en mi caso es que necesito que aparezca la fecha de hoy.SOLOcuando yoagregarocambiarinformación en la celda. si yo soloborrarinformación del celular necesito que la fecha permanezca igual que antes de borrar información.
PD: El archivo es una hoja de cálculo de Excel pero se utilizará en Google Drive.
Respuesta1
Esta respuesta es si vas directamente a una hoja de Google.
Creo que esto le ayudará a avanzar en la dirección correcta. No tengo claro si está diciendo que los campos que monitoreará están esparcidos por la hoja o si las celdas no adyacentes a las que hizo referencia eran solo ejemplos dentro de un rango. Si tiene celdas esparcidas, probablemente tendrá que crear múltiples "rango de vigilancia", como he señalado en el código, y verificar que la celda que se está editando esté dentro de al menos un rango; de lo contrario, saldrá de la función.
Quiero señalar que no me esforcé demasiado para que esto funcionara y admitiera la eliminación de todos los valores de un rango de varias celdas.
Además, tenga en cuenta que tendrá que ir a Herramientas -> Editor de secuencias de comandos dentro de Google Sheet, y luego Recursos -> Activadores (el menú puede ser diferente dependiendo de lo que haya hecho allí antes) y agregar un activador "onEdit()" a la Hoja.
Entonces, tu función será algo como esto
function onEdit(e){
var DateCol = "K";
var DeletedColNote = "L";
var curDate = Utilities.formatDate(new Date(), "GMT-5", "MM/dd/yyyy")
var editRange = e.range;
var rowIndex = editRange.getRowIndex();
var colIndex = editRange.getColumnIndex();
// May need to set up multiple ranges like this and check all ranges if
// checked fields are not in adjacent cells
var watchRange = { // B2:G20
top : 2, // start row
bottom : 20, // end row
left : 2, // start col
right : 7 // end col
};
// Exit if we're out of range
if (rowIndex < watchRange.top || rowIndex > watchRange.bottom) return;
if (colIndex < watchRange.left || colIndex > watchRange.right) return;
var currentValue = editRange.getValue();
currentValue = currentValue.replace(/^\s+|\s+$/g,""); //"trim" kludge
if (currentValue.length == 0)
{
// Set a column to show when data was deleted
SpreadsheetApp.getActiveSheet().getRange(DeletedColNote + rowIndex).setValue("Deleted: " + curDate);
}
else
{
// Set a column to show last edit date
SpreadsheetApp.getActiveSheet().getRange(DateCol + rowIndex).setValue("Edited: " + curDate);
SpreadsheetApp.getActiveSheet().getRange(DeletedColNote + rowIndex).setValue("");
}
}
Respuesta2
Desafortunadamente, VBA no se adapta a Google Sheets, pero si se elimina el requisito de Google Sheets, es bastante sencillo hacerlo con VBA.
Adjunte este código al evento WorkSheet_Change para la hoja de trabajo de interés...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim RngToMark As Range
' define the range you want to track changes for
Set RngToMark = ActiveSheet.Range("A1:G30")
' make sure the change occurred inside the range
If Intersect(Target, RngToMark) Is Nothing Then Exit Sub
' ignore deleting the contents
If Target.Value = "" Then Exit Sub
' mark the row as changed
ActiveSheet.Range("K" & Target.Row).Value = Format(Now(), "MMM-DD-YYYY")
End Sub
Para llegar a la ubicación correcta para insertar esto...
- En VBEditor, haga doble clic en el nombre de la hoja de trabajo en "Objetos de Microsoft Excel".
- Luego seleccione Hoja de trabajo en el menú desplegable de la izquierda.
- Luego seleccione Cambiar en el menú desplegable de la derecha.