¿Por qué no está 'google.script.run' no trabajando desde la etiqueta del cuerpo html 'onload'?

Escribí una función para una Hoja de Google (en el editor de scripts de Sheet) en la que el usuario selecciona una celda, ejecuta la función de un menú personalizado, y luego un formulario html aparece con el texto de la célula seleccionada y una célula adyacente en el formulario.

Aquí está el archivo 'Code.gs':

function reviewApplication() {
  var html = HtmlService.createHtmlOutputFromFile('Index').setSandboxMode(HtmlService.SandboxMode.IFRAME);
  SpreadsheetApp.getUi().showModalDialog(html, 'Review PD Application');
}

function getTitleInfo() {
  return SpreadsheetApp.getActiveRange().getValue();
}

function getTeacherInfo() {
  var aRow = SpreadsheetApp.getActiveRange().getRow();
  return SpreadsheetApp.getActiveSheet().getRange(aRow, 5).getValue();
}

Y aquí está el archivo 'Index.html':

html

 
  
 
 
  
Title:
Teacher:
Decision:
Comments:

El problema es que cuando la UI aparece con la forma, los elementos 'títulos' y 'teachername' de la forma están en blanco, pero se supone que están poblados con el texto en esa fila de la hoja de cálculo. Cuando miro la transcripción de ejecución, la función 'reviewApplication' funciona correctamente, pero la función 'getTitleInfo' falla y la duración es de 0 segundos. ¿Sabes por qué está fallando en este punto?

Hay otro código de script para cuando el formulario se presenta, pero lo dejo ahora porque he reducido el problema hasta cuando el HTML se carga. Extrañamente, esto estaba funcionando bien hasta el fin de semana pasado.

Aquí hay una imagen que muestra que la función 'reviewPD' funciona, pero entonces la función 'getTitleInfo' falla.

Screenshot of Execution Log

Pregunta hecha hace 3 años, 4 meses, 28 días - Por bitwisewizard


3 Respuestas:

  • Me gustó y funcionó.

    GS:

    function reviewApplication() {
      var html = HtmlService.createHtmlOutputFromFile('ah3');
      SpreadsheetApp.getUi().showModalDialog(html,'Review PD Application');
    }
    
    function getTitleInfo() {
      return 'Teacher Title';
    }
    
    function getTeacherInfo() {
      
      return 'Hello World';
    }
    

    HTML:

    html
    
     
      
     
     
      
    Title:
    Teacher:
    Decision:
    Comments:

    Debe ser algo malo con la forma en que estás recibiendo datos.

    Pruebe la prueba getTeacherInfo() o getTeacherInfo() por sí mismos para asegurarse de que está funcionando

    enter image description here

    **Esta versión realmente hace la colección de datos muy similar a lo que quieres y está completamente funcionando excepto que no he probado el envío porque no creo que tenga el código para apoyarlo.

    Código:

    function reviewApplication() {
      var html = HtmlService.createHtmlOutputFromFile('ah3');
      SpreadsheetApp.getUi().showModalDialog(html,'Review PD Application');
    }
    
    function getTeacherInfo() {
      const ss=SpreadsheetApp.getActive();
      const sh=ss.getActiveSheet();
      const row=sh.getActiveRange().getRow();
      return sh.getRange(row,5).getValue();
    }
    
    function getTitleInfo() {
      return SpreadsheetApp.getActiveRange().getValue();
    }
    

    HTML:

    html
    
     
      
     
     
      
    Title:
    Teacher:
    Decision:
    Comments:

    Respondida el Dec 18, 2020 a las 04:46 - por logiclinguist

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando es que la función google.script.run no funciona desde el atributo onload de la etiqueta body en tu archivo HTML. La razón por la que esto no funciona es porque las funciones de google.script.run no se pueden llamar antes de que la página esté completamente cargada.

    La solución a este problema es usar la función google.script.run después de que la página haya cargado completamente. Para lograr esto, puedes mover la llamada a la función google.script.run.withSuccessHandler(onTitle).getTitleInfo() al final de tu script dentro de la etiqueta body, o bien, puedes utilizar la función window.onload para llamar a la función después de que la página se haya cargado completamente.

    Aquí te muestro cómo modificar tu archivo 'Index.html' utilizando la función window.onload:

    html
    
     
      
     
     
      
    Title:
    Teacher:
    Decision:
    Comments:

    Al hacer esto, la función google.script.run.withSuccessHandler(onTitle).getTitleInfo() se ejecutará después de que la página se haya cargado completamente, evitando así el problema que estás experimentando. Espero que esta solución te ayude a solucionar tu problema.

    Respondida el Dec 19, 2020 a las 04:45 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que estás intentando llamar a google.script.run desde el evento onload del cuerpo HTML. Esto no funcionará porque el objeto google.script.run solo está disponible después de que se haya cargado el Servicio de Ejecución de Apps Script.

    Para resolver este problema, debes agregar el siguiente código a la parte superior de tu archivo Index.html:

    ```html

    ```

    Esto garantizará que google.script.run solo se llame después de que el Servicio de Ejecución de Apps Script esté disponible.

    Respondida el Dec 19, 2020 a las 04:54 - por Gemini

    Votos positivos: 0 | Votos negativos: 0