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.

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

Tags:  , , , ,

Answer

  1. Avatar for 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ón onSelectionChange para utilizar una variable estática rngLast:

    function onSelectionChange(e) {
      var rngLast = PropertiesService.getDocumentProperties().getProperty('rngLast');
      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 != null) {
          if(rngLast != e.range.getA1Notation()) {
            Browser.msgBox("Se perdió el enfoque en " + rngLast);
          }
        }
        Browser.msgBox("Se obtuvo el enfoque en " + e.range.getA1Notation());
        PropertiesService.getDocumentProperties().setProperty('rngLast', e.range.getA1Notation());
      }
    }
    

    Lo que hace es recuperar el último valor de rngLast de las propiedades del documento utilizando PropertiesService.getDocumentProperties().getProperty('rngLast'). Si esto no está definido, significa que esta es la primera ejecución de la función, por lo que rngLast 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 actual e.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 utilizando PropertiesService.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.

Comments are closed.