AI Lead Qualifier and Booking Agent
Module 25 · ai · intermediate
busy.js
// Busy time ranges for slot finding: from the request (tests), the internal calendar, or Google Calendar.
const x = $('Pick Extraction').first().json;
let busy = [], calendar_error = null, source;
if (x.busy_override) { busy = x.busy_override; source = 'request'; }
else if (x.calendar_mode === 'internal') { source = 'internal'; }
else {
source = 'google';
const items = $('Get Busy Times').all().map((i) => i.json);
if (items.some((e) => e.error) || (items.length === 1 && !items[0].start && !items[0].id && Object.keys(items[0]).length > 0 && !items[0].kind)) {
calendar_error = String(items.find((e) => e.error)?.error?.message ?? items[0].error ?? 'calendar returned no events list (check the Google Calendar credential)').slice(0, 300);
}
busy = items.filter((e) => e.start && e.transparency !== 'transparent' && e.status !== 'cancelled')
.map((e) => ({ start: e.start.dateTime ?? e.start.date, end: e.end.dateTime ?? e.end.date }));
}
return [{ json: { ...x, busy, busy_source: source, calendar_error } }];