Alert email di drop quote in Google Sheets
Risposta: pianifica un trigger orario in Apps Script che chiama GET /v1/drops (o legge un board IMPORTDATA) e invia MailApp.sendEmail quando dropPct supera la soglia. Free (ritardo 30 s) o Hobby bastano per il polling; il push live resta il WebSocket Builder.
Schema#
Chiave in Script Properties (non nel foglio condiviso). Endpoint: /v1/drops?sport=soccer&minutes=10&min_pct=5.
function dropAlert() {
const key = PropertiesService.getScriptProperties().getProperty('PINNFEED_KEY'); // ps_live_...
const url = 'https://pinnfeed.io/v1/drops?sport=soccer&minutes=5&min_pct=5&limit=20';
const res = UrlFetchApp.fetch(url, { headers: { 'x-api-key': key }, muteHttpExceptions: true });
if (res.getResponseCode() !== 200) { console.log(res.getContentText()); return; }
const drops = JSON.parse(res.getContentText()).drops;
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Drops') || ss.insertSheet('Drops');
const seen = new Set(sh.getRange('A:A').getValues().flat().filter(String));
const fresh = drops.filter(d => !seen.has(d.marketId + '|' + d.outcome + '|' + d.movedAt));
if (!fresh.length) return;
fresh.forEach(d => sh.appendRow([d.marketId + '|' + d.outcome + '|' + d.movedAt, d.home, d.away,
d.market, d.outcome, d.from, d.to, d.dropPct, d.movedAt]));
const body = fresh.map(d => `${d.home} v ${d.away}: ${d.market} ${d.outcome} ${d.from} -> ${d.to} (${d.dropPct}%)`).join('\n');
MailApp.sendEmail(Session.getActiveUser().getEmail(), `Pinnacle drops: ${fresh.length}`, body);
}
Correlato: dropping odds, Sheets time-driven.
CTA#
Builder (99 €/mese). Prova 3 giorni; carta richiesta. REST gratis: signup.
Domande frequenti#
Sheets apre il WebSocket?#
No — REST pianificato.
Contenuto educativo per adulti?#
Sì (18+).
Contenuto educativo per maggiorenni (18+): non pronostici né promesse di guadagno. In Italia scommetti solo con operatori autorizzati ADM.