Javascript 谷歌日历API:获取指定日期的免费插槽列表

Javascript 谷歌日历API:获取指定日期的免费插槽列表,javascript,npm,google-calendar-api,Javascript,Npm,Google Calendar Api,我需要在我的谷歌日历上得到一个免费的插槽列表。现在我刚刚得到一份活动清单。我正在使用npm 您可以通过两个步骤从谷歌日历中获得免费插槽。使用 首先,你必须在日历中记录所有的忙/闲时间 var startDate = new Date(), endDate = new Date(); var rootStart = startDate, rootEnd = endDate; gcal(<accessToken>).freebusy.query({ "item

我需要在我的谷歌日历上得到一个免费的插槽列表。现在我刚刚得到一份活动清单。我正在使用npm


您可以通过两个步骤从谷歌日历中获得免费插槽。使用

首先,你必须在日历中记录所有的忙/闲时间

var startDate = new Date(),
    endDate = new Date();

var rootStart = startDate,
    rootEnd = endDate;

gcal(<accessToken>).freebusy.query({
    "items":[{
        "id": calObj.name
    }],
    "timeMin": startDate.toISOString(),
    "timeMax": endDate.toISOString(),
    "timeZone": "GMT+0100"
},{
    fields: "calendars,groups,kind,timeMax,timeMin", 
    alt:"json"
}, function(err, data) {
    if(err) return console.log(err)

    // then calculate free slots
    return slotsFromEvents(startDate, data.calendars[<calName>].busy)
})

var interval = 2, // how big single slot should be (in this case 2 hrs) 
freeSlots = []; 

function slotsFromEvents(date,events) {
    events.forEach(function (event, index) { //calculate free from busy times
        if (index == 0 && startDate < event.start) {
            freeSlots.push({startDate: startDate, endDate: event.start});
        }
        else if (index == 0) {
            startDate = event.end;
        }
        else if (events[index - 1].end < event.start) {
            freeSlots.push({startDate: events[index - 1].end, endDate: event.start});
        }

        if (events.length == (index + 1) && event.end < endDate) {
            freeSlots.push({startDate: event.end, endDate: endDate});
        }
    });


    if (events.length == 0) {
        freeSlots.push({startDate: startDate, endDate: endDate});
    }

    var temp = {}, hourSlots = [];
    freeSlots.forEach(function(free, index) {
        var freeHours = new Date(free.endDate).getHours() - new Date(free.startDate).getHours(), freeStart = new Date(free.startDate), freeEnd = new Date(free.endDate);
        while(freeStart.getHours()+freeHours+interval>=0) { // 11 + 4 + 2 >= 0
            if(freeHours>=interval) {
                temp.e = new Date(free.startDate);
                temp.e.setHours(temp.e.getHours()+freeHours);
                temp.s = new Date(free.startDate);
                temp.s.setHours(temp.s.getHours()+freeHours-interval);
                if(temp.s.getHours() >= rootStart.getHours() && temp.e.getHours() <= rootEnd.getHours()) {
                    hourSlots.push({calName: calObj.name, startDate:temp.s, endDate:temp.e});
                    temp = {};
                }
            }
            freeHours--;
        }
    })

    // callBack(freeSlots, hourSlots);
}
var startDate=new Date(),
endDate=新日期();
var rootStart=startDate,
rootEnd=endDate;
gcal().freebusy.query({
“项目”:[{
“id”:calObj.name
}],
“timeMin”:startDate.toISOString(),
“timeMax”:endDate.toISOString(),
“时区”:“GMT+0100”
},{
字段:“日历、组、种类、最大时间、最小时间”,
alt:“json”
},函数(错误,数据){
if(err)返回console.log(err)
//然后计算空闲时隙
返回slotsFromEvents(startDate、data.calendars[].busy)
})
var interval=2,//单个插槽应该有多大(在这种情况下为2小时)
自由地块=[];
函数slotsFromEvents(日期、事件){
forEach(函数(事件,索引){//计算繁忙时间的空闲时间
如果(索引==0&&startDate=0){//11+4+2>=0
如果(空闲时间>=间隔){
温度e=新日期(自由开始日期);
temp.e.setHours(temp.e.getHours()+freehurs);
温度s=新日期(自由开始日期);
temp.s.setHours(temp.s.getHours()+自由小时间隔);

if(temp.s.getHours()>=rootStart.getHours()&&temp.e.getHours()顺便说一句,没有API端点可以获取特定日期的空闲时间列表。解决方法是获取当天的事件列表,然后从一天的开始到结束进行安排。计算事件之间的时间。然后就有了特定日期的空闲时间。希望这对您有所帮助。首先,您必须定义“时隙”。日历没有固定的“时隙”。一个事件可以是你喜欢的长或短,并且可以在你喜欢的任何时间开始/结束,因此你的问题没有真正的意义。您好。这可以很容易地转换为一种日历,可以与其他人共享(比如“我的空闲时隙”)?当然可以,为什么不可以?
var startDate = new Date(),
    endDate = new Date();

var rootStart = startDate,
    rootEnd = endDate;

gcal(<accessToken>).freebusy.query({
    "items":[{
        "id": calObj.name
    }],
    "timeMin": startDate.toISOString(),
    "timeMax": endDate.toISOString(),
    "timeZone": "GMT+0100"
},{
    fields: "calendars,groups,kind,timeMax,timeMin", 
    alt:"json"
}, function(err, data) {
    if(err) return console.log(err)

    // then calculate free slots
    return slotsFromEvents(startDate, data.calendars[<calName>].busy)
})

var interval = 2, // how big single slot should be (in this case 2 hrs) 
freeSlots = []; 

function slotsFromEvents(date,events) {
    events.forEach(function (event, index) { //calculate free from busy times
        if (index == 0 && startDate < event.start) {
            freeSlots.push({startDate: startDate, endDate: event.start});
        }
        else if (index == 0) {
            startDate = event.end;
        }
        else if (events[index - 1].end < event.start) {
            freeSlots.push({startDate: events[index - 1].end, endDate: event.start});
        }

        if (events.length == (index + 1) && event.end < endDate) {
            freeSlots.push({startDate: event.end, endDate: endDate});
        }
    });


    if (events.length == 0) {
        freeSlots.push({startDate: startDate, endDate: endDate});
    }

    var temp = {}, hourSlots = [];
    freeSlots.forEach(function(free, index) {
        var freeHours = new Date(free.endDate).getHours() - new Date(free.startDate).getHours(), freeStart = new Date(free.startDate), freeEnd = new Date(free.endDate);
        while(freeStart.getHours()+freeHours+interval>=0) { // 11 + 4 + 2 >= 0
            if(freeHours>=interval) {
                temp.e = new Date(free.startDate);
                temp.e.setHours(temp.e.getHours()+freeHours);
                temp.s = new Date(free.startDate);
                temp.s.setHours(temp.s.getHours()+freeHours-interval);
                if(temp.s.getHours() >= rootStart.getHours() && temp.e.getHours() <= rootEnd.getHours()) {
                    hourSlots.push({calName: calObj.name, startDate:temp.s, endDate:temp.e});
                    temp = {};
                }
            }
            freeHours--;
        }
    })

    // callBack(freeSlots, hourSlots);
}