Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

250
Vistas
Google Apps Script se activa con éxito al enviar el formulario, pero la función no se ejecuta

Estoy tratando de copiar una fila de la hoja de respuestas del formulario vinculado "principal" a otra hoja "sub" si un valor en la respuesta del formulario coincide con un criterio particular, Columna 4 = "Subconjunto"

Tengo onFormSubmit configurado como activador con Implementación - Encabezado, Fuente - Hoja de cálculo, Evento - En el envío del formulario. Cuando envío el formulario, el activador de onFormSubmit registra la ejecución como Completada, pero la fila no se copia en la hoja "sub".

La función getLast me permite mover la fila a la siguiente posición disponible en la hoja "sub" comenzando en la segunda columna porque tengo casillas de verificación en la primera columna hasta el final de la hoja.

El código funciona tal como está cuando se usa la función onEdit e ingresa manualmente "Subconjunto" en la columna 4. Parece que no puedo entender por qué no sucede nada con onFormSubmit a pesar de que el disparador se ejecuta con éxito. ¡Por favor ayuda!

 function onFormSubmit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = e.source.getActiveSheet(); var r = e.source.getActiveRange(); if(s.getName() == "main" && r.getColumn() == 4 && r.getValue() == "Subset") { var row = r.getRow(); var numColumns = s.getLastColumn(); var targetSheet = ss.getSheetByName("sub"); var column = targetSheet.getRange("B:B").getValues(); var lastRow = getLast(column); var target = targetSheet.getRange(lastRow + 1, 2); s.getRange(row, 1, 1, numColumns).copyTo(target); } } function getLast(range){ var rowNum = 0; var blank = false; for(var row = 0; row < range.length; row++){ if(range[row][0] === "" && !blank){ rowNum = row; blank = true; }else if(range[row][0] !== ""){ blank = false; } } return rowNum; }
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Pensé que a partir de su pregunta, cuando su secuencia de comandos se ejecuta mediante el disparador OnSubmit, la declaración if de if(s.getName() == "main" && r.getColumn() == 4 && r.getValue() == "Subset") {} puede ser siempre false , porque en este caso, el rango no es la columna "D". Por esto, su secuencia de comandos no funciona. Pensé que esta podría ser la razón de su problema.

Cuando se activa el activador OnSubmit, para ejecutar el script en la declaración if, ¿qué tal la siguiente modificación?

Guión modificado:

 function onFormSubmit(e) { var range = e.range; var sheet = range.getSheet(); var srcRange = sheet.getRange(range.rowStart, 1, 1, sheet.getLastColumn()); if (srcRange.getValues()[0][3] == "Subset") { // srcRange.getValues()[0][3] means the column "D". var targetSheet = e.source.getSheetByName("sub"); var column = targetSheet.getRange("B:B").getValues(); var lastRow = getLast(column); var target = targetSheet.getRange(lastRow + 1, 2); srcRange.copyTo(target); } }
about 4 years ago · Juan Pablo Isaza Denunciar

0

Gracias Tanaike, estaba averiguando esto como publicaste. El objeto de evento pasado por el activador de envío de formulario no tiene valores para .getActiveSheet() y .getActiveRange() porque no hay un usuario activo.

Mi solución no es tan elegante como la tuya, pero funcionó. Aprecio cómo evitas SpreadsheetApp por completo al obtener la hoja directamente desde el objeto del evento.

 function onFormSubmit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("main"); var response = e.values; if(response[3] == "Subset") { var row = sheet.getLastRow(); var numColumns = sheet.getLastColumn(); var targetSheet = ss.getSheetByName("sub"); var column = targetSheet.getRange("B:B").getValues(); var lastRow = getLast(column); var target = targetSheet.getRange(lastRow + 1, 2); sheet.getRange(row, 1, 1, numColumns).copyTo(target); } }

En una inspección más profunda e inspirado por su solución, combiné su enfoque con mi uso de e.values en la declaración if para aterrizar en un enfoque funcional y esbelto. ¡Muchas gracias, Tanaike!

 function onFormSubmit(e) { var response = e.range; if(response.getValues()[0][3] == "Subset") { var targetSheet = e.source.getSheetByName("sub"); var col = targetSheet.getRange("B:B").getValues(); var lastRow = getLast(col); var target = targetSheet.getRange(lastRow + 1, 2); response.copyTo(target); } }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda