Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

README.md

Manejo de Datos (Google Apps Script)

Scripts de Google Apps Script que leen las respuestas de correo de las participantes desde Gmail y actualizan automáticamente la hoja de cálculo de inscripciones. Evitan tener que revisar la bandeja de entrada una por una y marcar a mano quién confirmó su cupo o quién sigue interesada desde la lista de espera.

Qué hace cada script

Script Qué detecta Qué escribe en la hoja
marcarConfirmaciones.gs Respuestas cuyo cuerpo contiene la palabra confirm (así cubre "confirmo", "confirmado", "confirm my spot") Confirmó
marcarInteresListaDeEspera.gs Cualquier respuesta no vacía, sin importar el contenido: responder ya es señal de interés Mostró Interés

Ambos, además, hacen lo mismo con el hilo de correo:

  1. Le agregan una etiqueta de Gmail (la crean si no existe).
  2. Lo archivan, para que salga de la bandeja de entrada.
  3. Escriben Actualizado desde script en una columna de control, para que sepas qué filas tocó el script y cuáles marcaste a mano.

El emparejamiento entre correo y fila se hace buscando la primera celda de la fila que contenga @ y comparándola con el remitente del mensaje.

Antes de empezar

  1. Crea el Google Form con el que las participantes se inscriben.

  2. Vincula el formulario a una hoja de cálculo: en el formulario, pestaña RespuestasVincular a Hojas de cálculo. Se creará una pestaña llamada Respuestas de formulario 1 con una fila por inscripción.

  3. Agrega dos columnas al final de esa hoja, a la derecha de las respuestas del formulario:

    • una para el estado (Confirmó / Mostró Interés),
    • otra para la marca de control (Actualizado desde script).

    Anota en qué letra de columna quedó cada una: las vas a necesitar en el paso de configuración.

  4. Envía el correo a las participantes (aceptación o lista de espera) desde la misma cuenta de Gmail que va a ejecutar el script. El asunto de ese correo es lo que el script usará para encontrar las respuestas, así que guárdalo tal cual lo enviaste.

Instalación

  1. Abre la hoja de cálculo de respuestas.
  2. Ve a Extensiones → Apps Script.
  3. En el panel Archivos, haz clic en + → Secuencia de comandos y crea un archivo nuevo usando como base marcarConfirmaciones.gs o marcarInteresListaDeEspera.gs, según el caso de uso.
  4. Pega el contenido y ajusta la configuración (siguiente sección).
  5. Guarda y ejecuta la función una vez desde el editor:
    • marcarConfirmaciones (archivo marcarConfirmaciones.gs),
    • marcarInteresListaDeEspera (archivo marcarInteresListaDeEspera.gs).
  6. La primera ejecución te pedirá autorizar el script para acceder a Gmail y a la hoja de cálculo. Es normal: el script necesita leer tus correos para encontrar las respuestas.

El script debe ejecutarse con la misma cuenta de Google que envió los correos y que recibe las respuestas. Si el correo salió desde otra cuenta, no encontrará ningún hilo.

Configuración

Estos son los valores que debes actualizar en cada script antes de usarlo:

Qué ajustar Dónde Valor de ejemplo
Nombre de la pestaña de respuestas getSheetByName(...) "Respuestas de formulario 1"
Asunto del correo que enviaste a las participantes subjectFiltro "Django Girls Colombia - ¡Has sido aceptada!"
Etiqueta de Gmail para los hilos procesados etiquetaNombre "DG Virtual Colombia 2026"
Ventana de búsqueda de correos newer_than:2d en GmailApp.search(...) últimos 2 días
Columna de estado (lectura + escritura) índice 32 y getRange(i + 1, 33) columna AG
Columna de la marca de control getRange(i + 1, 36) columna AJ

Cómo calcular los números de columna

Apps Script usa dos numeraciones distintas en el mismo script, y es la fuente más común de errores al adaptarlo:

  • datos[i][32] → índice desde 0. El 32 es la columna número 33.
  • getRange(fila, 33) → índice desde 1. El 33 es esa misma columna.

Es decir: el índice de lectura siempre es el número de escritura menos 1, y en los scripts apuntan a la misma columna a propósito — el script lee esa celda para saber si ya la procesó antes y no volver a escribirla.

Equivalencias útiles:

Letra Número (getRange) Índice (datos[i][…])
AF 32 31
AG 33 32
AH 34 33
AI 35 34
AJ 36 35

Si tu formulario tiene más o menos preguntas que el nuestro, tus columnas estarán en otra posición: cuenta las columnas de tu hoja y ajusta los tres números (el índice de lectura, y los dos de escritura).

Notas y limitaciones

Cosas que conviene saber antes de confiar ciegamente en el resultado:

  • La detección de correo es por @. El script toma la primera celda de la fila que contenga una arroba. Si tu formulario pregunta por el usuario de Instagram o X antes que por el correo, tomará el valor equivocado. Ubica la pregunta del correo antes que cualquier otra que pueda contener @.
  • Solo se revisan los mensajes recibidos. Ambos scripts filtran con msg.isInInbox(), así que descartan los correos que enviaste tú. Sin ese filtro, un correo original que diga "responde para confirmar tu cupo" haría que el script se marcara a sí mismo como confirmación. Si adaptas los scripts, no quites esa línea.
  • No sobrescribe lo que ya está marcado. Si la celda de estado tiene cualquier valor, el script salta esa fila. Para reprocesar a alguien, borra primero el contenido de su celda de estado.
  • Los datos se leen una sola vez al inicio (getDataRange().getValues()). Dentro de una misma ejecución, el script no "ve" lo que acaba de escribir; en la práctica no importa, porque cada persona tiene una sola fila.
  • Solo escribe, nunca borra. Si algo sale mal, lo peor que puede pasar es que marque filas de más — revisa la columna de control y limpia a mano.

Automatizar la ejecución con un activador

Hasta aquí el script solo corre cuando le das Ejecutar a mano. Para que el proceso sea realmente automático hay que crear un activador (trigger), que es lo que le dice a Apps Script cada cuánto ejecutar la función por su cuenta.

La idea no es que la validación esté corriendo todo el tiempo, sino cada cierto intervalo. Para nuestros eventos lo dejamos cada 3 horas: es suficiente para que la hoja esté al día durante la semana de confirmaciones, y no gasta cuota revisando una bandeja de entrada donde no ha llegado nada nuevo.

Cómo crearlo

  1. Abre la hoja de cálculo y ve a Extensiones → Apps Script.

  2. En la barra lateral izquierda, haz clic en el ícono de reloj (Activadores).

  3. Abajo a la derecha, haz clic en + Añadir activador.

  4. Llena el formulario así:

    Campo Valor
    Elige la función que se ejecutará marcarConfirmaciones o marcarInteresListaDeEspera
    Elige qué implementación se debe ejecutar Head
    Selecciona el origen del evento Basado en tiempo
    Selecciona el tipo de activador basado en tiempo Temporizador por horas
    Selecciona el intervalo de horas Cada 3 horas
    Configuración de notificación de errores Notificarme inmediatamente
  5. Haz clic en Guardar. Si es la primera vez, Google te pedirá autorizar el script otra vez; acepta con la misma cuenta que envía y recibe los correos.

Desde ese momento el script corre solo cada 3 horas, sin que la hoja de cálculo tenga que estar abierta.

Cosas para tener en cuenta

  • Un activador por función. Si vas a usar los dos scripts, crea dos activadores, uno para cada función.
  • El activador queda atado a tu cuenta, no a la hoja de cálculo. Si quien lo creó deja de tener acceso al correo, deja de funcionar. Créalo con la cuenta organizadora del evento, no con una cuenta personal.
  • La ventana de búsqueda debe ser mayor que el intervalo. Con newer_than:2d y ejecuciones cada 3 horas hay bastante margen: cada corrida revisa correos que ya vio antes, pero el script no reescribe filas que ya tienen valor, así que no pasa nada.
  • Revisa el historial cuando algo no cuadre. En la barra lateral, la sección Ejecuciones muestra cada corrida con su estado (Completado / Con errores) y los mensajes de error.
  • Apágalo cuando termine el evento. En la lista de activadores, menú de tres puntos → Borrar activador. Si no, el script sigue revisando tu correo indefinidamente.