Variables declaradas con la sentencia Static.
Tengo esta función escrita en VBA que me gustaría convertir a Apps Script, pero no he encontrado algo similar para declarar una variable de tipo estático y mantener guardado el objeto de rango en la variable rngLast con múltiples ejecuciones de la función onSelectionChange (e):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Static rngLast As Range
If Not Application.Intersect(Target, Range("A1:Z100")) Is Nothing Then
If Not rngLast Is Nothing Then
If rngLast.Address <> Target.Address Then
MsgBox "Se perdió el enfoque en " & rngLast.Address
End If
End If
MsgBox "Se obtuvo el enfoque en " & Target.Address
Set rngLast = Target
End If
End Sub
En Apps Script, lo escribí de la siguiente manera:
var rngLast;
function onSelectionChange(e) {
var spreadsheet = SpreadsheetApp.getActive();
var sh = spreadsheet.getActiveSheet();
var rowActCell = e.range.getRow();
var colActCell = e.range.getColumn();
if((rowActCell >= 1 && rowActCell <= 100) && (colActCell >= 1 && colActCell <= 26)) {
if(rngLast != undefined || rngLast != null) {
if(rngLast.getA1Notation() != e.range.getA1Notation()) {
Browser.msgBox("Se perdió el enfoque en " + rngLast.getA1Notation());
}
}
Browser.msgBox("Se obtuvo el enfoque en " + e.range.getA1Notation());
rngLast = e.range
}
}
pero no puedo mantener el valor de e.range guardado en rngLast, por lo que no funciona. En la práctica, cada vez que onSelectionChange(e) se activa al cambiar la selección de la celda, rngLast asume el estado de no definido.
Para probar cómo funciona, reemplacé:
var rngLast;
con
var rngLast = SpreadsheetApp.getActive().getActiveSheet().getRange(“A1”);
Espero que con mi mal inglés me haya explicado. 😉
Gracias, adiós.
Gabriele
davy.ai
Para declarar una variable estática en Apps Script, puede utilizar la clase
PropertiesService
para almacenar el valor de la variable entre las ejecuciones de la función. Así es como puede modificar la funciónonSelectionChange
para utilizar una variable estáticarngLast
:Lo que hace es recuperar el último valor de
rngLast
de las propiedades del documento utilizandoPropertiesService.getDocumentProperties().getProperty('rngLast')
. Si esto no está definido, significa que esta es la primera ejecución de la función, por lo querngLast
permanecerá sin definir hasta que se le asigne un valor más adelante en la función.Si
rngLast
está definido, se compara su valor con la notación A1 del rango actuale.range
. Si no son iguales, se muestra un cuadro de mensaje indicando que se perdió el enfoque. Luego, se guarda el rango actual en las propiedades del documento utilizandoPropertiesService.getDocumentProperties().setProperty('rngLast', e.range.getA1Notation())
.Con esta modificación,
rngLast
mantendrá su valor entre las ejecuciones de la función y la función se comportará de la misma manera que la versión de VBA que proporcionaste.