¿El disparador instalado para disparar script en una forma diferente?

Estoy tratando de ejecutar un script que está conectado a un formulario (A) cuando se presenta una forma diferente (B). Tengo una serie de formas diferentes que son similares y necesita ejecutar el mismo script, así que en lugar de copiar el código a cada script me pregunto si esto es posible. Hice una función de activación instalable en A, señalando a B. He concedido permiso cuando me lo piden. Cuando publique B, el guión en A fires, y lo consigo en el registro:

Exception: No response with ID 2_ABaOnudSFDkNQOL2Xn4fNOmT95GrTotEW8LSjxfI5qf6qceDN5hD5CHKqNT5D4G_DdONWq0 exists for this form.
    at onFormAnswerSubmit(Kod:40:20)

La línea (Kod:40:20) que se detiene es la línea que pica los datos publicados:

  var items    = e.response.getItemResponses();

¿Se supone que esto funcione o es imposible pasar datos publicados de un formulario a un script en una forma diferente?

¿O hay algo más que pueda hacer en el gatillo? ¿Como forzar un pase de e. o algo así? Aquí está el gatillo que he creado:

/**
 * Creates a trigger for when a different form is posted that runs a function in this script (run once)
 */
function createOtherFormTrigger() {
  var formID = FormApp.openById("XXXXX"); // form B
    
  ScriptApp.newTrigger('onFormAnswerSubmit') // a function in this script, in form A
      .forForm(formID)
      .onFormSubmit()
      .create();
}

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


5 Respuestas:

  • Necesitas cambiar la lógica un poco:

    La función disparada sobre el gatillo debe estar contenida en el mismo script como el gatillo.

    Código de muestra para crear un formularioEnviar el gatillo para el formulario B:

    //run this once
    function createOtherFormTrigger() { 
    var formB = FormApp.openById("XXX");   
      ScriptApp.newTrigger('onFormAnswerSubmit') // a function in this script, in form B
          .forForm(formB) //the active form is Form B
          .onFormSubmit()
          .create();
    }
    function onFormAnswerSubmit(e){
       var formB = e.source;
       var items = e.response.getItemResponses(); //items of the latest form response of form B
       var formA = FormApp.openById("XXXX"); // Form A 
      ... 
      // do what you need to do with form A
    }
    

    El código anterior creará disparador que dispara cuando se presente una respuesta de formulario para el formulario B. Por tanto, no es importante o el script está obligado a formar A, forma B o es independiente. En realidad, podría tener sentido místico implementar esas funciones en un script independiente, para asegurarse de que no interfieran con otros disparadores de presentación de formularios que podría tener en un script con código de formulario.

    Respondida el Dec 17, 2020 a las 19:04 - por codesculptor3f6e

    Votos positivos: 0 | Votos negativos: 0

  • Tenía el mismo problema. Dondequiera que ponga e.response Tengo el mismo error. Parece que la única solución es usar un script solo de soporte en lugar de un script atado.

    Respondida el Dec 17, 2020 a las 19:10 - por quantumcoder403a

    Votos positivos: 0 | Votos negativos: 0

  • Sólo entiendo el problema.

    Así que si quieres captar la respuesta de la presentación del formulario, necesitas vincular tu script al formulario. Para ello, vaya a su vista de edición de formularios, luego haga clic en los tres puntos, luego abra editor de scripts.

    Si lo hiciste antes, intenta hacerlo de nuevo y asegúrate de que tu script esté allí. En mi caso, la primera vez que abro el editor de scripts de Google Form, no ata el guión. Así que cuando lo hice la segunda vez, abre un nuevo editor de scripts con plantilla en blanco. Después de copiar mi guión al nuevo, funciona perfectamente.

    Respondida el Dec 17, 2020 a las 19:19 - por codecatalyst

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando se debe a que estás tratando de acceder a los datos de respuesta de un formulario diferente al que generó la función activadora. En Google Apps Script, los objetos de evento (en este caso e) están asociados específicamente con el formulario que activó la función, por lo que no es posible pasar directamente los datos de un formulario a otro de esta manera.

    Una solución a este problema sería almacenar los datos relevantes de la respuesta del formulario B en algún tipo de almacén de datos temporal, como una hoja de cálculo o una base de datos externa, y luego acceder a esos datos desde el script asociado al formulario A.

    Aquí tienes un ejemplo de cómo podrías modificar tu código para lograr esto:

    • Guarda los datos relevantes en una hoja de cálculo cuando se envíe el formulario B:

    ```javascript function onFormBSubmit(e) { var responseData = e.values; // Obtiene los valores de la respuesta del formulario B var ss = SpreadsheetApp.openById('IDdelahojadecalculo'); var sheet = ss.getSheetByName('Nombredelahoja

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

    Votos positivos: 0 | Votos negativos: 0

  • No es posible pasar datos publicados de un formulario a un script en un formulario diferente directamente mediante un disparador de instalación. Los disparadores de instalación solo pueden ejecutarse en el mismo formulario en el que están instalados.

    Sin embargo, hay una solución alternativa que puedes utilizar para lograr lo que deseas:

    • Crea una hoja de cálculo vinculada: Vincula la hoja de cálculo a ambos formularios (A y B). Cuando se envía el Formulario B, los datos se agregarán a la hoja de cálculo vinculada.
    • Utiliza un script de App Script como intermediario: Crea un script de App Script que se ejecute en un disparador instalado en la hoja de cálculo vinculada. Este script debe leer los datos agregados desde el Formulario B y luego ejecutar el script deseado en el Formulario A.

    Aquí tienes un ejemplo del script de App Script:

    
    function onFormSubmit(e) {
      // Obten los datos del formulario B
      const submittedData = e.values;
    
      // Ejecuta el script del Formulario A
      const formA = FormApp.openById('ID_DEL_FORMULARIO_A');
      const formAResponse = formA.submit({ 'entry.1234': submittedData[0][1] }); // Cambia 'entry.1234' al nombre de la pregunta en el Formulario A
    }
    

    Para configurar esto:

    Vincula la hoja de cálculo a los Formularios A y B. Instala el script de App Script en la hoja de cálculo vinculada. Agrega un disparador instalado al script para que se ejecute cuando se modifique la hoja de cálculo. En el disparador de instalación del Formulario B, apunta a la función onFormSubmit del script de App Script.

    De esta manera, cuando se envía el Formulario B, los datos se guardarán en la hoja de cálculo vinculada y el script de App Script se ejecutará, ejecutando el script deseado en el Formulario A.

    Respondida el Dec 18, 2020 a las 19:15 - por Gemini

    Votos positivos: 0 | Votos negativos: 0