29 Set, 25

Guida completa: integrare Google Calendar con Whatsender usando Google Apps Script

Scopo: guida passo‑passo da pubblicare su WordPress per inviare automaticamente promemoria WhatsApp ai clienti tramite Whatsender, leggendo il numero dalla descrizione dell’evento.


Perché usare questa integrazione

  • Zero server: lo script gira dentro il tuo account Google (Apps Script), quindi non serve un VPS o hosting esterno.
  • Semplice da gestire: puoi modificare messaggi, intervallo e formato direttamente dall’editor di script.
  • Affidabile: i trigger di Apps Script consentono controlli regolari (es. ogni 5 minuti).
  • Automazione pratica: crea una procedura dove il numero del cliente è parte dell’evento (descrizione) e il promemoria viene inviato automaticamente.

Nota legale: assicurati di avere il consenso del cliente a ricevere messaggi WhatsApp (privacy/GDPR, politiche WhatsApp/Whatsender).


Requisiti

  1. Account Google (con Google Calendar attivo).
  2. Token API di Whatsender (fornito dal pannello Whatsender/node.whatsender.it).
  3. Permessi per modificare Google Calendar e creare trigger nello stesso account.

Panoramica del flusso

  1. Lo script controlla gli eventi imminenti nel calendario (es. eventi con inizio entro i prossimi X minuti).
  2. Per ogni evento, legge la descrizione e cerca una riga con whatsapp:NUMERO.
  3. Se trova il numero e l’evento non è già stato notificato (tag [PROMEMORIA INVIATO]), invia il messaggio attraverso l’API Whatsender.
  4. Se l’invio è andato a buon fine, aggiunge alla descrizione del calendario il tag [PROMEMORIA INVIATO] per evitare duplicati.

Formato consigliato della descrizione evento

Nel campo descrizione dell’evento Google Calendar inserisci una riga con il numero del cliente in questo formato (esempio):

Appuntamento taglio capelli
whatsapp:393401234567
Portare documento X

Lo script riconoscerà il numero 393401234567 e invierà il promemoria.


Script pronto

Copia e incolla questo codice in un nuovo progetto Apps Script (https://script.google.com/).

/***************************************
 * Google Calendar → Whatsender Reminder
 * - Legge numero in descrizione (whatsapp:...)
 * - Aggiunge [PROMEMORIA INVIATO] dopo invio
 ***************************************/

// === CONFIGURAZIONE ===
const WHATSENDER_TOKEN = 'INSERISCI_IL_TUO_TOKEN'; // sostituisci con il token
const MINUTI_PRIMA_EVENTO = 30; // promemoria X minuti prima

function inviaPromemoriaCalendar() {
  const calendario = CalendarApp.getDefaultCalendar();
  const oraAttuale = new Date();
  const finoA = new Date(oraAttuale.getTime() + MINUTI_PRIMA_EVENTO * 60 * 1000);

  const eventi = calendario.getEvents(oraAttuale, finoA);
  if (eventi.length === 0) return;

  eventi.forEach(evento => {
    const titolo = evento.getTitle();
    const inizio = evento.getStartTime();
    const luogo = evento.getLocation() || '—';
    const descrizione = evento.getDescription() || '';

    if (descrizione.includes('[PROMEMORIA INVIATO]')) return; // già inviato

    const match = descrizione.match(/whatsapp[:=]\s*([0-9]{9,15})/i);
    if (!match) return;

    const numeroCliente = match[1].trim();
    const msgCliente = `\n🔔 *Promemoria Appuntamento*\n📅 *${titolo}*\n🕒 Ore: ${formattaOra(inizio)}\n📍 Luogo: ${luogo}\n📝 ${descrizione.replace(/whatsapp[:=]\s*[0-9]{9,15}/i, '').replace('[PROMEMORIA INVIATO]', '').trim()}`.trim();

    const esito = inviaMessaggioWhatsApp(numeroCliente, msgCliente);
    if (esito) {
      evento.setDescription(descrizione + '\n\n[PROMEMORIA INVIATO]');
    }
  });
}

function inviaMessaggioWhatsApp(numero, messaggio) {
  const url = 'https://node.whatsender.it/send';
  const payload = { receiver: numero, msgtext: messaggio, token: WHATSENDER_TOKEN };
  const options = { method: 'post', contentType: 'application/x-www-form-urlencoded', payload: payload, muteHttpExceptions: true };
  try {
    const response = UrlFetchApp.fetch(url, options);
    const testo = response.getContentText();
    return testo.includes('"success":true') || testo.includes('success:true');
  } catch (e) {
    console.error('Errore invio WhatsApp:', e);
    return false;
  }
}

function formattaOra(data) {
  const h = data.getHours().toString().padStart(2, '0');
  const m = data.getMinutes().toString().padStart(2, '0');
  return `${h}:${m}`;
}

function creaTriggerAutomatico() {
  ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t));
  ScriptApp.newTrigger('inviaPromemoriaCalendar').timeBased().everyMinutes(5).create();
}

Miglioramenti consigliati (sicurezza e robustezza)

1) Non mettere il token in chiaro — usa Script Properties

function setToken(value) {
  PropertiesService.getScriptProperties().setProperty('WHATSENDER_TOKEN', value);
}

// Poi nello script recuperi il token così:
const WHATSENDER_TOKEN = PropertiesService.getScriptProperties().getProperty('WHATSENDER_TOKEN');
  • Esegui setToken('IL_TUO_TOKEN') una volta (dallo script editor) per memorizzare il token in modo più sicuro.

2) Gestire numeri con prefisso “+” o separatori

Se vuoi accettare +39 340 123 4567 o whatsapp=+39-340-1234567, usa questa logica di estrazione e pulizia:

const rawMatch = descrizione.match(/whatsapp[:=]\s*([+0-9\-\s\.]{7,20})/i);
if (rawMatch) {
  const numeroCliente = rawMatch[1].replace(/[^0-9]/g, ''); // rimuove tutto tranne cifre
}

3) Invia a più numeri (più linee o comma-separated)

  • Se vuoi inviare lo stesso promemoria a più numeri, metti più righe whatsapp:... nella descrizione o una riga con numeri separati da virgola. Esempio di parsing:
const matches = [...descrizione.matchAll(/whatsapp[:=]\s*([+0-9\-\s\.]{7,20})/ig)];
matches.forEach(m => {
  const numero = m[1].replace(/[^0-9]/g, '');
  inviaMessaggioWhatsApp(numero, msgCliente);
});

Come testare passo‑passo

  1. Apri https://script.google.com/ e crea un nuovo progetto.
  2. Incolla lo script (versione rapida o quella con proprietà).
  3. Salva e modifica WHATSENDER_TOKEN (oppure esegui setToken() se usi Properties).
  4. Crea un evento di prova su Google Calendar con inizio 20–30 minuti dopo e nella descrizione inserisci whatsapp:TUONUMERO.
  5. Premi EseguiinviaPromemoriaCalendar nello script editor per testare manualmente (ti verranno chieste autorizzazioni la prima volta).
  6. Controlla Visualizza → Log o Esecuzioni per vedere eventuali errori (UrlFetchApp, token invalido, ecc.).
  7. Verifica che l’evento venga aggiornato con [PROMEMORIA INVIATO] nella descrizione e che il messaggio arrivi.

Risoluzione dei problemi comuni

  • Autorizzazioni: se il trigger non si attiva, esegui manualmente una funzione per autorizzare gli scope (Calendar, UrlFetch).
  • Token non valido: Whatsender risponde con error; controlla la risposta nei log (UrlFetchApp.fetch restituisce il testo di errore).
  • Messaggi doppi: assicurati che lo script aggiunga correttamente [PROMEMORIA INVIATO] e che la regex non fallisca; evita trigger duplicati cancellando i trigger preesistenti.
  • Fuso orario: Apps Script usa la timezone del progetto account; se vedi orari errati, controlla File → Project properties (o Settings) e assicurati sia impostata la timezone corretta.
  • Quotas / limiti: Apps Script e servizi esterni hanno limiti giornalieri — non inviare massivamente senza controllare il piano Whatsender.

Opzione avanzata: log su Google Sheets

Per tenere traccia degli invii puoi aggiungere poche righe per salvare su uno sheet:

function logSuSheet(eventoTitolo, numero, esito) {
  const ss = SpreadsheetApp.openById('ID_DEL_TUO_SHEET');
  const sheet = ss.getSheetByName('Log') || ss.getSheets()[0];
  sheet.appendRow([new Date(), eventoTitolo, numero, esito]);
}

E chiamare logSuSheet(titolo, numeroCliente, esito ? 'OK' : 'ERR'); dopo ogni invio.


Checklist prima di pubblicare

  • Verificare che il token Whatsender sia corretto.
  • Testare con un evento di prova.
  • Impostare trigger con creaTriggerAutomatico().
  • Assicurarsi del consenso clienti a ricevere messaggi.
  • (Opz.) Spostare il token nelle Script Properties per maggiore sicurezza.