如何在谷歌日历中接收正确的可用日期

问题描述 投票:0回答:1

我编写了一段代码来检查员工的谷歌日历,并为请求的时间提供可用的开始日期和结束日期/时间。 但当我这样做时,它并没有显示 100% 正确的结果。在大多数情况下(我尝试了不同的事情)它会在另一个事件期间显示一个插槽。或者例如我尝试整合工作时间,以便它从上午 8 点到下午 5 点进行检查...然后它总是说,没有可用的活动...

这是我的代码的最后一个版本。 你能看一下并帮我提建议吗?

function getAvailability(email, minutes) {
  if (!email) {
    throw new Error('Die E-Mail-Adresse ist erforderlich.');
  }
  if (!minutes) {
    throw new Error('Die Dauer in Minuten ist erforderlich.');
  }

  var calendar;
  try {
    calendar = CalendarApp.getCalendarById(email);
    if (!calendar) {
      throw new Error('Kalender nicht gefunden oder Zugriff verweigert für: ' + email);
    }
  } catch (e) {
    console.error('Fehler beim Abrufen des Kalenders: ' + e.message);
    throw e;
  }

  var now = new Date();
  var twoWeeksFromNow = new Date(now.getTime() + (14 * 24 * 60 * 60 * 1000));
  var events = calendar.getEvents(now, twoWeeksFromNow);

  for (var i = 0; i < events.length - 1; i++) {
    var currentEvent = events[i];
    var nextEvent = events[i + 1];

    if (currentEvent.isAllDayEvent()) {
      continue;
    }
    
    var currentEventEnd = currentEvent.getEndTime();
    var nextEventStart = nextEvent.getStartTime();

    if ((nextEventStart - currentEventEnd) >= (minutes * 60 * 1000)) {
      return {
        'start': currentEventEnd,
        'end': new Date(currentEventEnd.getTime() + (minutes * 60 * 1000))
      };
    }
  }

  var lastEventEnd = events[events.length - 1].getEndTime();
  if ((twoWeeksFromNow - lastEventEnd) >= (minutes * 60 * 1000)) {
    return {
      'start': lastEventEnd,
      'end': new Date(lastEventEnd.getTime() + (minutes * 60 * 1000))
    };
  }

  return null;
}

function doGet(e) {
  // Logge die eingehenden Parameter für die Anfrage
  console.log("Received parameters:", e.parameters);

  try {
    var email = e.parameter['Bearbeiter-Mail'];
    var minutes = parseInt(e.parameter['Dauer-Minuten'], 10);

    // Überprüfe, ob die Parameter vorhanden und gültig sind
    if (!email) {
      throw new Error('Die E-Mail-Adresse ist erforderlich.');
    }
    if (isNaN(minutes)) {
      throw new Error('Die Dauer in Minuten muss eine gültige Zahl sein.');
    }

    // Führe die Hauptfunktionalität aus
    var availability = getAvailability(email, minutes);

    // Logge die ermittelte Verfügbarkeit
    if (availability) {
      console.log("Verfügbarkeit gefunden:", availability);
      return ContentService.createTextOutput(JSON.stringify(availability))
        .setMimeType(ContentService.MimeType.JSON);
    } else {
      console.log("Keine Verfügbarkeit gefunden.");
      return ContentService.createTextOutput('Keine Verfügbarkeit gefunden')
        .setMimeType(ContentService.MimeType.TEXT);
    }
  } catch (error) {
    // Logge und gebe Fehler zurück
    console.error("Error:", error);
    return ContentService.createTextOutput(JSON.stringify({ 'error': error.message }))
      .setMimeType(ContentService.MimeType.JSON);
  }
}```




The goal is to send the calender email adress + meeting time in meetings to the api and then receive a feedback, when the person is available. (The api process works).. The problem I have is just in the way how the calendar is checkt. It does not work correctly. 
api google-apps-script calendar
1个回答
0
投票

根据提供的代码,有几件事可能会导致不正确的可用性结果:

代码假设连续事件没有间隙。因此,如果两个 1 小时的会议之间有 30 分钟的间隔,则可能会显示该时段不可用。您需要检查差距是否大于请求的会议持续时间。 该代码没有考虑日历工作时间限制等因素。因此,它可能会显示正常工作时间之外的可用性。您需要添加逻辑以遵守日历操作时间。 重复事件或全天事件可能无法正确处理,并且可能会错误地显示为可用。需要额外的逻辑来正确处理这些。 要解决这些问题:

检查活动与会议持续时间之间的差距 添加日历营业时间限制 正确处理重复发生的和全天的事件 此外,您可以使用 FreeBusy API

,而不是通过扫描所有事件来获取可用性
© www.soinside.com 2019 - 2024. All rights reserved.