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
- Account Google (con Google Calendar attivo).
- Token API di Whatsender (fornito dal pannello Whatsender/node.whatsender.it).
- Permessi per modificare Google Calendar e creare trigger nello stesso account.
Panoramica del flusso
- Lo script controlla gli eventi imminenti nel calendario (es. eventi con inizio entro i prossimi X minuti).
- Per ogni evento, legge la descrizione e cerca una riga con
whatsapp:NUMERO
. - Se trova il numero e l’evento non è già stato notificato (tag
[PROMEMORIA INVIATO]
), invia il messaggio attraverso l’API Whatsender. - 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
- Apri
https://script.google.com/
e crea un nuovo progetto. - Incolla lo script (versione rapida o quella con proprietà).
- Salva e modifica
WHATSENDER_TOKEN
(oppure eseguisetToken()
se usi Properties). - Crea un evento di prova su Google Calendar con inizio 20–30 minuti dopo e nella descrizione inserisci
whatsapp:TUONUMERO
. - Premi
Esegui
→inviaPromemoriaCalendar
nello script editor per testare manualmente (ti verranno chieste autorizzazioni la prima volta). - Controlla
Visualizza → Log
oEsecuzioni
per vedere eventuali errori (UrlFetchApp, token invalido, ecc.). - 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
(oSettings
) 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.