Hoja de cálculo + WhatsApp

Integrar WhatsApp con Google Sheets

Google Sheets es el editor de hojas de cálculo en línea de Google, sin costo y colaborativo, que corre en el navegador y guarda todo en Google Drive. Además de fórmulas y tablas, tiene Apps Script, un entorno de código JavaScript integrado que permite leer filas, reaccionar a ediciones y llamar a APIs externas. Es esta combinación de una lista de contactos organizada en columnas más scripts lo que convierte una hoja común en un pequeño motor de automatización de WhatsApp.

Por qué conectar

Quien trabaja con listas de leads, clientes o pedidos casi siempre mantiene todo en una hoja de Google Sheets: nombre en una columna, teléfono en otra, estado al lado. Conectar esa hoja a ZapZap API permite disparar mensajes de WhatsApp directo desde las filas, sin copiar número por número en el celular. Puedes avisar a los clientes sobre una cita, enviar la confirmación de un pedido o hacer seguimiento a una lista de leads en minutos, marcando en la propia columna quién ya recibió el mensaje. Como el envío sale de una instancia administrada con calentamiento en comunidad y recursos antibloqueo, reduces el riesgo de problemas al escribir a varios contactos desde la misma hoja.

Paso a paso

  1. 1

    Arma la hoja con columnas claras

    En Google Sheets, crea una pestaña con las columnas Nombre, Teléfono (en formato 5511999999999, con código de país y de área), Mensaje y Estado. Cada fila es un contacto al que se enviará. La columna Estado sirve para marcar Enviado después de cada envío.

  2. 2

    Abre Apps Script

    En el menú superior, haz clic en Extensiones y luego en Apps Script. Se abrirá el editor de código en una pestaña nueva, ya vinculado a esta hoja. Borra el contenido por defecto de la función myFunction para empezar limpio.

  3. 3

    Guarda tus credenciales en Propiedades del script

    En el editor, ve a Configuración del proyecto (ícono de engranaje) y, en la sección Propiedades del script, agrega ZAPZAP_KEY y ZAPZAP_SECRET con tu x-api-key y x-api-secret de ZapZap API. Así las claves no quedan escritas en el código.

  4. 4

    Pega el script que lee las filas y llama a UrlFetchApp

    En el editor, usa SpreadsheetApp.getActiveSheet().getDataRange().getValues() para leer las filas y UrlFetchApp.fetch() para enviar cada contacto a ZapZap API, pasando los headers x-api-key y x-api-secret. Recorre las filas en un bucle, omite a quien ya tenga Estado Enviado y escribe Enviado en la columna después de cada respuesta.

  5. 5

    Ejecuta y crea un menú o activador

    Haz clic en Ejecutar y autoriza el script en el popup de Google (es normal la primera vez). Para facilitar el uso diario, agrega un onOpen() que cree un menú personalizado en la hoja, o configura un Activador en Activadores para que corra en un horario programado. Revisa la documentación oficial de la API en https://api.zapzapapi.com/llms.txt para los nombres exactos de ruta y campos antes de pasar a producción.

Ejemplo

// Apps Script (Extensiones > Apps Script) : ejemplo ILUSTRATIVO
// Revisa la ruta y los campos exactos en https://api.zapzapapi.com/llms.txt
function enviarWhatsApp() {
  const props = PropertiesService.getScriptProperties();
  const sheet = SpreadsheetApp.getActiveSheet();
  const linhas = sheet.getDataRange().getValues();

  for (let i = 1; i < linhas.length; i++) {
    const [nome, telefone, mensagem, status] = linhas[i];
    if (status === 'Enviado' || !telefone) continue;

    UrlFetchApp.fetch('https://api.zapzapapi.com/messages/send', {
      method: 'post',
      contentType: 'application/json',
      headers: {
        'x-api-key': props.getProperty('ZAPZAP_KEY'),
        'x-api-secret': props.getProperty('ZAPZAP_SECRET')
      },
      // campos exactos en la doc: https://api.zapzapapi.com/llms.txt
      payload: JSON.stringify({ number: String(telefone), text: mensagem })
    });

    sheet.getRange(i + 1, 4).setValue('Enviado');
    Utilities.sleep(4000); // espacia los envios
  }
}

Ilustrativo. Los campos y endpoints exactos están en la documentación.

Preguntas frecuentes

¿Necesito saber programar para usar Google Sheets con WhatsApp?

Lo básico ayuda, pero no necesitas crear nada desde cero. Apps Script vive dentro del propio Google Sheets, en Extensiones y Apps Script, y el ejemplo de esta página ya trae la estructura lista: leer las filas, llamar a ZapZap API y marcar la columna Estado. Basta con pegarlo, cambiar las credenciales y ajustar los nombres de las columnas.

¿ZapZap API es oficial de WhatsApp?

No. ZapZap API es una solución de WhatsApp no oficial, basada en instancias administradas que conectas a tu propio número. La autenticación es con x-api-key y x-api-secret, y el envío y la recepción ocurren por REST y webhooks por evento. Eso te da libertad para integrar directo con Google Sheets, sin proceso de aprobación.

¿Corro riesgo de bloqueo al escribir a varios contactos de la hoja?

Todo envío en volumen tiene riesgo. Las instancias de ZapZap API pasan por calentamiento en comunidad y cuentan con recursos antibloqueo, lo que reduce el riesgo. Aun así, el cuidado del lado de la hoja importa: usa la función Utilities.sleep para espaciar los envíos, personaliza el texto por fila y evita disparar cientos de mensajes iguales de una vez.

¿Cuánto cuesta conectar Google Sheets a ZapZap API?

Google Sheets y Apps Script no tienen costo. En ZapZap API, el costo es de R$15 por número activo al mes, en modelo prepago, y hay un crédito de bienvenida (sujeto a la campaña vigente) para que pruebes la integración antes de pasar a producción.

¿Cómo sé los nombres exactos de las rutas y campos de la API?

El código de esta página es ilustrativo, para mostrar el formato de la llamada con los headers x-api-key y x-api-secret. Los nombres exactos del endpoint y de los campos del cuerpo de la solicitud están en la documentación en https://api.zapzapapi.com/llms.txt. Consúltala antes de pasar tu script a producción.

Empieza ahora

Crea tu cuenta, conecta un número en minutos y prueba la API con calentamiento y anti-bloqueo. R$15 por número activo/mes, prepago, sin permanencia.