Pasar un array generado en Google Apps Script a una página HTML y utilizar para navegación básica

Tengo una función simple que recupera datos de una hoja de cálculo y pasa esta matriz a una ventana modal.

var ui = SpreadsheetApp.getUi();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('sheet1'); 
var data = sheet.getRange(2,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
const htmlForModal = HtmlService.createTemplateFromFile("detailedView");
htmlForModal.DATA = data;
htmlForModal.rowIndex = 0; // starts with the first array

const htmlOutput = htmlForModal.evaluate();
return ui.showModalDialog(htmlOutput, "title");  

Obviamente los datos son una serie de arrays.

Dentro del HTML puedo utilizar valores DATA a través de scriptlets como este:

= DATA[rowIndex][4] ?

y funciona. El problema es que necesito un sistema para navegar a través de la matriz. Un simple botón "NEXT" para actualizar el párrafo con una nueva filaIndex (rowIndex+1) cada vez que lo hago clic. Sé que puedo usar el documento. queryselector para cambiar el HTML interior de mi párrafo, pero ho puede cambiar = DATA[rowIndex][4] ? con = DATA[rowIndex+1][4] ? ?

Intenté una consola. registro al comienzo del HTML para registrar DAATA y se llena correctamente. Pero parece ser una cadena de texto, no un array. Si DATA renderiza sólo la primera vez, ¿hay un método para reconstruir el array al cargar HTML y hacerlo disponible para scripts dentro del HTML?

Posiblemente evitaría una llamada a google.script.run. Lo intenté y funciona pero cada vez que hago clic en el botón tiene que llamar script google, cargar la fila y devolverla... y es sooo lento :-( Mientras pasa toda la matriz en el html es rápido...

¿Puedes ayudarme? :-)

Pregunta hecha hace 3 años, 5 meses, 0 días - Por codesculptor3f6e


3 Respuestas:

  • Usted debe solicitar todos los datos del lado cliente una vez utilizando google.script.run ()ver docs), guardarlo, y cambiar el diseño de página usando JavaScript cuando el usuario cambie la página sin solicitar los datos de nuevo. Ver mejores prácticas sobre carga asincrónica vs añadir datos usando plantillas.

    // Code.gs snippet
    
    function showDialog() {
      var htmlOutput = HtmlService.createTemplateFromFile('detailedView')
          .evaluate();
      var ui = SpreadsheetApp.getUi();
      return ui.showModalDialog(htmlOutput, 'Dialog title');
    }
    
    function getData() {
      // Example based on the question code
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('sheet1');
      var data = sheet.getRange(2,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
      return data.map(function (value) {
        return value[4];
      })
    }
    
     detailedView.html snippet 
    
    
    

    También te recomendaría tener un loading... mensaje por defecto, por lo que el usuario sabe que los datos están siendo procesados.

    Referencias

    Respondida el Dec 16, 2020 a las 11:01 - por daniel1

    Votos positivos: 0 | Votos negativos: 0

  • En lugar de intentar acceder directamente a los valores del array en el HTML, una solución más eficiente sería utilizar JavaScript para manejar la navegación a través de la matriz y actualizar la interfaz de usuario.

    Aquí te dejo un ejemplo de cómo podrías implementar un botón "NEXT" para navegar a través de las filas de la matriz en el HTML:

    • Dentro del archivo `detailedView.html`, puedes agregar el siguiente código JavaScript para manejar la navegación a través de la matriz y actualizar el contenido en el modal:
    html
    
    
      
        
      
      
        

    • Luego, en tu archivo `.gs`, asegúrate de pasar los datos y el índice de fila actual al HTML:
    javascript
    const htmlForModal = HtmlService.createTemplateFromFile("detailedView");
    htmlForModal.DATA = data;
    htmlForModal.rowIndex = 0; // Comenzar con la primera fila
    
    const htmlOutput = htmlForModal.evaluate();
    return ui.showModalDialog(htmlOutput, "title");
    

    Con esta configuración, el botón "NEXT" te permitirá navegar por las filas de la matriz sin necesidad de hacer llamadas adicionales a google.script.run. Cada vez que hagas clic en el botón, se actualizará la información en el modal de manera rápida y eficiente. Espero que esta solución te ayude a lograr la funcionalidad que buscas. ¡Buena suerte!

    Respondida el Dec 17, 2020 a las 11:01 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Problema:

    Necesitas navegar por una matriz de datos obtenida de una hoja de cálculo de Google Apps Script y utilizarla para la navegación básica en una ventana modal HTML. El objetivo es evitar llamadas lentas a google.script.run cada vez que se hace clic en un botón "Siguiente".

    Solución:

    1. Transforma la matriz en un objeto JSON:

    En la secuencia de comandos de Apps Script, convierte la matriz de datos en un objeto JSON antes de pasarlo al HTML:

    js
    const dataObj = JSON.stringify(data);
    htmlForModal.DATA_OBJ = dataObj;
    

    2. Extrae el objeto JSON en el HTML:

    En el HTML, extrae el objeto JSON de la variable pasada:

    html
    
    

    3. Actualiza rowIndex con un botón "Siguiente":

    Agrega un botón "Siguiente" al HTML:

    html
    
    

    Y agrega un controlador de eventos para actualizar rowIndex y mostrar los datos cuando se hace clic:

    js
    document.getElementById("next-button").addEventListener("click", function() {
      rowIndex++;
      showData();
    });
    
    function showData() {
      document.getElementById("title").innerHTML = dataObj[rowIndex][4];
    }
    

    4. Carga inicial de datos:

    Cuando se carga el HTML por primera vez, llama a showData() para mostrar los datos iniciales:

    js
    showData();
    

    Beneficios:

    Todos los datos se cargan en el HTML una sola vez, lo que elimina la necesidad de llamadas lentas a google.script.run. La navegación por los datos es rápida y receptiva. El uso de un objeto JSON permite un acceso fácil a los datos dentro del HTML.

    Nota:*

    Asegúrate de escapar correctamente los datos de la hoja de cálculo antes de pasarlo al HTML para evitar vulnerabilidades de secuencias de comandos entre sitios.

    Respondida el Dec 17, 2020 a las 11:12 - por Gemini

    Votos positivos: 0 | Votos negativos: 0