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.

Mensajes de texto de actualización de estado de la consola

Tengo un script de Google Apps que muestra una única salida de aplicación web al final.

La duración del script es de aproximadamente ~20 segundos, y estoy buscando mejorar la experiencia del usuario mediante una actualización intermitente del estado del script durante este período.

Entiendo los desafíos de la operación asíncrona entre el servidor y el cliente, pero me sorprende que una funcionalidad “trivial” como esta parezca bastante difícil de lograr.

Revisé temas similares, pero no he encontrado un buen ejemplo.

Ejemplo de código:

function doGet(e){
output = function1();
output = function2();
return HtmlService.createHtmlOutput(output);
}

function function1() {
//Hacer algo
return “output1”;
}

function function2() {
//Hacer algo
return “output2”;
}

No busco reemplazar las llamadas de función por llamadas HTML. ¿Pero tal vez podría consultar continuamente una variable global hasta que se complete la ejecución del script, si esto es factible?

Para hacerlo más concreto:

code.gs:

var data = “test”;
Logger.log(data);

function doGet(){
return HtmlService.createHtmlOutputFromFile(‘index’);
}

function main() {
data = “1”;
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);

data = “2”;
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);

data = “3”;
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);

data = “4”;
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);

data = “5”;
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
}

function pushMSG(str){
return str
}

index.html





Iniciando script…
<script>
  google.script.run.main();

  var i = 0;
  var refreshId = setInterval( function () { 
    document.getElementById('output').innerHTML = data;
    google.script.run.withSuccessHandler(onSuccess).pushMSG();
    i = i + 1;
    if (i > 10) {
      clearInterval(refreshId);
      document.getElementById('output').innerHTML = "hecho1";
    }
  }, 500);

  function onSuccess(pushMSG) {
    document.getElementById('output').innerHTML = data;
  }

  document.getElementById('output').innerHTML = "hecho2";
</script>


… pero no encuentro ninguna manera de mostrar la variable “data” válida.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para mejorar la experiencia del usuario al actualizar intermitentemente el estado del script durante la ejecución, un enfoque es utilizar la comprobación del lado del cliente. Esto implica configurar un bucle en el código del lado del cliente que envía periódicamente solicitudes al servidor para verificar el estado del script y actualizar la pantalla en consecuencia.

    Aquí hay una implementación de ejemplo utilizando el código existente:

    Code.gs:

    var data = "test";
    Logger.log(data);
    
    function doGet(){
      return HtmlService.createHtmlOutputFromFile('index');
    }
    
    function main() {
      data = "1";
      pushMSG(data);
      Logger.log(data);
      Utilities.sleep(2000);
    
      data = "2";
      pushMSG(data);
      Logger.log(data);
      Utilities.sleep(2000);
    
      data = "3";
      pushMSG(data);
      Logger.log(data);
      Utilities.sleep(2000);
    
      data = "4";
      pushMSG(data);
      Logger.log(data);
      Utilities.sleep(2000);
    
      data = "5";
      pushMSG(data);
      Logger.log(data);
      Utilities.sleep(2000);
    }
    
    function pushMSG(str){
      return str
    }
    

    index.html:

    <!DOCTYPE html>
    <html>
      <head>
        <base target="_top">
      </head>
    
      <body>
        <div id="output">Script iniciado ...</div>
    
        <script>
          google.script.run.main();
    
          var i = 0;
          var refreshId = setInterval( function () {
            google.script.run.withSuccessHandler(onSuccess).pushMSG();
            i = i + 1;
            if (i > 10) {
              clearInterval(refreshId);
              document.getElementById('output').innerHTML = "hecho1";
            }
          }, 500);
    
          function onSuccess(data) {
            document.getElementById('output').innerHTML = data;
          }
    
          document.getElementById('output').innerHTML = "hecho2";
        </script>
      </body>
    </html>
    

    Esto utiliza la función setInterval para enviar periódicamente solicitudes al servidor utilizando google.script.run.withSuccessHandler. La respuesta del servidor se pasa a la función onSuccess, que actualiza la pantalla con el valor actual de data.

    La función pushMSG se utiliza para activar la función doGet en el lado del servidor, que volverá a ejecutar el script y actualizará el valor de data.

    Tenga en cuenta que la variable data en el lado del servidor es una variable global, y la función pushMSG simplemente devuelve su valor. Esto permite que el código del lado del cliente recupere el valor actual de data sin necesidad de pasarla como parámetro.

    En el código proporcionado, la variable data no se muestra correctamente porque el código del lado del cliente intenta acceder a ella directamente, en lugar de utilizar la función onSuccess para actualizar la pantalla. Cambiar la línea document.getElementById('output').innerHTML = data; a document.getElementById('output').innerHTML = pushMSG; debería solucionar este problema.

Comments are closed.