La integración nativa de Typeform con Sheets solo envía las respuestas enviadas después de activarla. Así se recuperan las respuestas antiguas y se mantiene el flujo de las nuevas.
Typeform trae su propia integración con Google Sheets y activarla toma unos dos minutos. El problema, y la razón por la que la mayoría acaba buscando esto, es que solo envía las respuestas enviadas después de conectarla. Cada respuesta recogida antes de ese momento se queda en Typeform. Esta guía cubre la integración nativa y dónde se queda corta, la ruta gratuita con Apps Script que sí trae todo tu histórico, y las concesiones de cada opción.
La integración nativa Typeform → Google Sheets
Abre tu formulario, ve al panel Connect, elige Integrations y selecciona Google Sheets. Autoriza la cuenta de Google, elige una hoja existente o deja que Typeform cree una, y mapea cada pregunta a una columna. A partir de ahí cada envío añade una fila. Es gratis en todos los planes, incluido el free tier.
Vale la pena conocer tres límites antes de depender de ella:
- Sin recuperación de histórico. Las respuestas enviadas antes de conectar la integración nunca se envían. No es un bug que puedas configurar.
- Un formulario por sheet. Combinar varios formularios en una tabla implica varias conexiones y consolidación manual.
- El mapeo de columnas es posicional. Reordenar preguntas o insertar columnas en medio del rango puede desalinear los envíos posteriores.
Opinión honesta: si estás montando un formulario nuevo y solo te importan las respuestas de hoy en adelante, quédate aquí. La integración nativa es genuinamente la opción más rápida y no cuesta nada. El resto de esta guía es para cuando necesitas histórico, varios formularios o un refresco que controles tú.
El histórico en dos minutos: exportación CSV
Para algo puntual, esto le gana a escribir cualquier código. En tu formulario ve a Results → Responses, luego Download responses y elige CSV. Importa ese archivo a un sheet con Archivo → Importar. Ya tienes tu histórico, y si además activas la integración nativa, las respuestas nuevas se añaden debajo.
La razón por la que esto no es la respuesta completa: el orden de columnas del CSV no coincide necesariamente con el mapeo de columnas de la integración, así que las dos mitades de tu tabla pueden discrepar. Comprueba que las cabeceras cuadran antes de confiar en un sheet combinado, y vuelve a exportar en lugar de repetir esto cada mes.
Typeform a Google Sheets gratis (Apps Script + Responses API)
La Responses API devuelve todas las respuestas que un formulario ha recogido, así que es la ruta gratuita que resuelve el problema del histórico de forma adecuada. Crea un personal access token en tu cuenta → Settings → Personal tokens, y saca el form ID de la URL de tu formulario (la cadena después de /form/, por ejemplo https://admin.typeform.com/form/AbC12dEf/create).
Antes del código, la parte que hace tropezar a casi todo el mundo. El array answers de una respuesta solo contiene las preguntas que se contestaron realmente. Las preguntas saltadas, y todo lo que quedó detrás de saltos de lógica no cumplidos, simplemente no están. Si construyes cada fila iterando ese array, alguien que se saltó la pregunta tres desplaza cada valor posterior una columna a la izquierda, y tu sheet se llena de datos desalineados sin avisar. La solución es leer primero la definición del formulario, construir un orden fijo de columnas a partir de sus refs de campo, y buscar cada respuesta por ref:
function importTypeformResponses() { const TOKEN = "TU_PERSONAL_ACCESS_TOKEN"; const FORM_ID = "AbC12dEf"; const headers = { Authorization: "Bearer " + TOKEN }; // 1. Lee la definición del formulario para que el orden de columnas sea // fijo y completo, independiente de qué contestó cada encuestado. const form = JSON.parse( UrlFetchApp.fetch("https://api.typeform.com/forms/" + FORM_ID, { headers }) .getContentText() ); const fields = form.fields.map((f) => ({ ref: f.ref, title: f.title })); // 2. Pagina por todas las respuestas. La paginación es por token: pasa el // token de la última respuesta como "before" para recorrer el histórico. const rows = []; let before = null; while (true) { let url = "https://api.typeform.com/forms/" + FORM_ID + "/responses?page_size=1000"; if (before) url += "&before=" + before; const page = JSON.parse( UrlFetchApp.fetch(url, { headers }).getContentText() ); if (!page.items || !page.items.length) break; page.items.forEach((item) => { // Indexa las respuestas de este envío por ref de campo. const byRef = {}; (item.answers || []).forEach((a) => { byRef[a.field.ref] = readAnswer(a); }); rows.push([ item.response_id, item.submitted_at, ...fields.map((f) => byRef[f.ref] ?? ""), // vacío, no desplazado ]); }); if (page.items.length < 1000) break; before = page.items[page.items.length - 1].token; Utilities.sleep(600); // mantente por debajo de ~2 peticiones/segundo } const sheet = SpreadsheetApp.getActiveSpreadsheet(); const tab = sheet.getSheetByName("Responses") || sheet.insertSheet("Responses"); tab.clearContents(); const header = ["response_id", "submitted_at", ...fields.map((f) => f.title)]; tab.getRange(1, 1, 1, header.length).setValues([header]); if (rows.length) { tab.getRange(2, 1, rows.length, header.length).setValues(rows); }} // Cada respuesta guarda su valor bajo una clave con el nombre de su tipo.function readAnswer(a) { switch (a.type) { case "choice": return a.choice.label || a.choice.other || ""; case "choices": return (a.choices.labels || []).join(", "); case "payment": return a.payment.amount; default: return a[a.type]; // text, email, number, boolean, date, url… }}Ejecútalo una vez para autorizar, y luego añade un trigger temporal en Triggers → Add Trigger → Time-driven para reimportar de forma programada. Ten en cuenta que esto reescribe toda la pestaña en cada ejecución, lo que la mantiene simple e idempotente pero borra cualquier cosa que escribas en ella. Pon tus propias fórmulas en una hoja aparte que apunte a esta.
Límites: Apps Script corta la ejecución a los seis minutos, así que los formularios muy grandes necesitan repartir la importación entre varias ejecuciones. No hay escritura de vuelta, no hay interfaz para elegir campos, y hay que revisar el script cada vez que añades preguntas.
Herramientas de automatización: Zapier, Make y n8n
Las tres tienen un trigger de Typeform que se dispara con cada envío nuevo (construido sobre los webhooks de Typeform, así que es casi instantáneo) y una acción de Google Sheets para añadir una fila. La configuración son diez a veinte minutos mapeando campos.
Opinión honesta: para Typeform a Sheets a secas esto es estrictamente peor que la integración nativa: cuesta dinero con volumen y hace el mismo trabajo con la misma limitación de no traer histórico. Se gana su sitio cuando el envío tiene que hacer varias cosas a la vez: publicar en Slack, crear un contacto en el CRM y caer en un sheet. El free tier de Zapier permite 100 tasks al mes, que un formulario con tráfico agota rápido.
El método Brooked
Brooked habla con la Responses API por ti, así que la primera importación trae todo el histórico del formulario en lugar de empezar de cero, y gestiona el mapeo por ref de campo descrito arriba para que las preguntas saltadas dejen vacíos en lugar de desplazar columnas. Varios formularios pueden caer en la misma hoja de cálculo con una única programación.
Paso 1: Instala Brooked
Instala Brooked desde el Google Workspace Marketplace. El free tier incluye 100 importaciones al mes, sin tarjeta de crédito.
Paso 2: Conecta Typeform
Abre Brooked en tu sheet, elige Typeform y pega un personal access token de Settings → Personal tokens de tu cuenta de Typeform. Brooked lista los formularios que ese token puede ver; elige uno, decide si quieres todas las respuestas o un rango de fechas, e importa.
Paso 3: Programa la actualización
Configura la importación para que se repita cada hora, cada día o cada semana. Como lee el histórico en lugar de transmitir envíos, un refresco programado también recoge lo que llegó mientras una integración basada en webhooks estaba fallando, que es el modo de fallo silencioso de todos los métodos al-enviar de esta guía.
Comparación de métodos
| Método | Costo | Setup | Actualización | Bidireccional | Ideal para |
|---|---|---|---|---|---|
| Integración nativa de Typeform con Sheets | Gratis (todos los planes) | 2 min | Al enviar (solo respuestas nuevas) | No | Un formulario, de aquí en adelante, sin histórico |
| Apps Script + Responses API | Gratis | 20 a 30 min | Trigger temporal | No | Recuperar el histórico, mapeo de columnas a medida |
| Zapier / Make / n8n | Free tier limitado · pago por volumen | 10 a 20 min | Al enviar, vía webhook | No | Repartir respuestas a Slack, un CRM y Sheets a la vez |
| Complemento Brooked | Free tier · Pro $29/usuario/mes | ~3 min | Programado (horario, diario, semanal) | Sí | Histórico completo, varios formularios en un sheet, refresco programado |
Casos de uso habituales
- Captación de leads: lleva los envíos del formulario a un sheet con el que el equipo de ventas ya trabaja, con columnas de puntuación al lado
- Análisis de encuestas: pivota respuestas de NPS o CSAT por segmento sin exportar un CSV cada vez
- Análisis de abandono: compara landed_at contra submitted_at para encontrar dónde abandonan el formulario
- Reporting multi-formulario: combina respuestas de varios formularios en una tabla con una columna con el nombre del formulario
- Enriquecimiento: cruza las respuestas con datos de CRM o facturación que ya viven en la hoja de cálculo
Solución de problemas
Preguntas frecuentes
¿Por qué mi integración de Typeform con Google Sheets no muestra las respuestas antiguas?
Es por diseño, y es la queja más habitual sobre la integración nativa. La conexión de Typeform con Google Sheets empieza a transmitir en el momento en que la activas: añade cada envío nuevo como una fila, pero nunca recupera las respuestas recogidas antes de ese punto. Para traer las respuestas históricas tienes que exportar un CSV desde el panel Results y pegarlo, o traerlas por la Responses API, que devuelve todas las respuestas que el formulario ha recogido.
¿Puedo conectar Typeform a Google Sheets gratis?
Sí, de dos formas. La propia integración de Google Sheets de Typeform está disponible en todos los planes, incluido el gratuito, y se configura en unos dos minutos desde el panel Connect; solo que únicamente gestiona las respuestas de aquí en adelante. El método con Apps Script de esta guía también es gratis y sí trae el histórico, a cambio de media hora de configuración y un script que mantienes tú.
¿Se rompe la integración de Typeform si edito la hoja de cálculo?
Puede pasar. La integración nativa mapea cada pregunta a una posición fija de columna cuando la conectas. Insertar o eliminar columnas en el sheet, o reordenar preguntas en el formulario, puede empujar los valores a las columnas equivocadas en los envíos posteriores. Añade columnas nuevas a la derecha del rango mapeado en lugar de en medio, y reconecta la integración después de cualquier cambio estructural del formulario.
¿Cómo llevo las respuestas de varios Typeforms a un solo sheet?
La integración nativa es un formulario por sheet, así que varios formularios implican varias conexiones y varias pestañas. Si quieres varios formularios en una sola tabla combinada, tráelos por la Responses API (cada formulario tiene su propio form ID) y escríbelos en un sheet compartido con una columna con el nombre del formulario, o usa un connector como Brooked que puede importar varios formularios a la misma hoja de cálculo con una única programación.
¿Cuál es el rate limit de la API de Typeform?
Las APIs de Typeform permiten aproximadamente 2 peticiones por segundo. El endpoint de Responses devuelve hasta 1.000 respuestas por página, así que incluso un formulario con decenas de miles de envíos necesita solo un puñado de peticiones. Pagina con el token devuelto en lugar de con un offset, y añade una pausa corta entre páginas si estás iterando.
¿Puedo escribir datos de vuelta desde Google Sheets a Typeform?
No, y es una limitación real de todos los métodos aquí. La API de Typeform es de solo lectura para respuestas: no puedes editar una respuesta enviada a través de ella. Lo que sí puedes hacer es enriquecer las respuestas del lado de Sheets (puntuación, categorización, añadir datos de CRM al lado) y empujar esa tabla enriquecida a otro sistema.
Conecta Typeform a Google Sheets hoy mismo.
El free tier de Brooked cubre 100 importaciones al mes, sin tarjeta de crédito. O consulta todos los detalles de la integración Typeform.
Instala Brooked gratis →

