Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

252
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!