检查Google日历活动的存在

时间:2018-01-08 18:16:55

标签: google-apps-script google-calendar-api

我的整个代码中存在一个非常基本的问题,这个问题在几天内变成了头疼。我已经对这个问题进行了广泛的研究,但无法找到一个确切的解决方案(或者我错过了我可能找到的那个)。这是:

我有一个电子表格,我在其中使用其属性(包括事件的ID)登录Google日历事件。有时,我会手动清理Google日历,只想运行一个代码来检查日历中是否存在事件,如果不删除该行。我的代码是:

function cleanCal(calid, eventid) {
  var calid = 'my calendar id';
  var eventid = 'event id';
  var event = CalendarApp.getOwnedCalendarById(calid).getEventById(eventid);

  if (event) {
    event.deleteEvent();
    // clean-up sheet
  } else {
    // clean-up sheet
  }
}

基本上,如果事件在日历中,代码应首先将其删除,然后清理工作表,如果不存在,则应仅清理工作表。但是,当执行代码时,虽然日历事件不存在,但if语句返回true并在尝试删除事件时引发错误,因为它实际上不存在。虽然事件不存在,但我还没有找到事件对象返回 true 的原因,原因和原因。我哪里做错了?感谢您的回复,我们非常感谢您的帮助。

[编辑] 这是我使用Calendar API v3检查事件存在的代码

function verifyCalendarEvent_OLD(calid, eventid) {
  var cal = CalendarApp.getCalendarById(calid)
  var exists = true;
  var response = Calendar.Events.list(
  calid, {
    showDeleted: true,
    fields: "items(id,status,summary)"
    }
  );

  for (var i = 0; i < response.items.length; i++) {
    if (response.items[i].id == eventid.split("@")[0] && response.items[i].status == "cancelled") {
      exists = false;
      break;
    }
  }
  return exists;
}

2 个答案:

答案 0 :(得分:2)

这个答案怎么样?

修改要点:

例如,如果没有事件ID的事件,CalendarApp.getOwnedCalendarById(calid).getEventById(eventid)将返回null。如果if对此进行评估,则将其用作false

所以我认为您可能会尝试检索已被删除的事件。因为在Google日历中,即使删除了该事件,也会保留事件ID。因此,虽然事件ID没有事件,但脚本中的if (event) {}会返回true。我确认CalendarApp.getOwnedCalendarById(calid).getEventById(eventid)检索已删除的事件。对于这种情况,您可以通过确认事件状态来了解事件是否已被删除。

  • 当事件状态为已确认时,表示该事件仍未删除。
  • 当事件状态取消时,表示该事件已被删除。

准备使用此修改后的示例脚本:

使用此修改过的脚本时,请在Advanced Google Services和API控制台上启用Calendar API。

在高级Google服务中启用Calendar API v3

  • 在脚本编辑器上
    • 资源 - &gt;高级Google服务
    • 启用Calendar API v3

Enable Calendar API at API console

  • 在脚本编辑器上
    • 资源 - &gt;云平台项目
    • 查看API控制台
    • 在“入门”中,单击“启用API”并获取密钥等凭据。
    • 在左侧,单击“库”。
    • 在搜索API&amp;服务,输入&#34;日历&#34;。然后点击日历API。
    • 单击“启用”按钮。
    • 如果API已启用,请不要关闭。
    • 运行此脚本时,如果发生错误,可能需要等待几分钟才能启用API。

修改后的脚本:

function cleanCal(calid, eventid) {
  var calid = 'my calendar id';
  var eventid = 'event id';
  var status = Calendar.Events.get(calid, eventid).status; // Added

  if (status == "confirmed") { // Modified
    var event = CalendarApp.getOwnedCalendarById(calid).getEventById(eventid); // Added
    event.deleteEvent();
    // clean-up sheet
  } else {
    // clean-up sheet
  }
}

如果我误解了你的问题,我很抱歉。

编辑:

在我的环境中,手动和脚本删除的事件可以检索为status=cancelled。由于我不了解你的情况,我准备了一个示例脚本。此示例脚本是一个简单的流程。

  1. 创建新活动。
  2. 删除已创建的活动。
  3. 确认已删除的活动。
    • 此处使用了您的其他脚本。
  4. 示例脚本:

    function deleteeventa() {
      // Create new event
      var calid = 'my calendar id';
      var c = CalendarApp.getCalendarById(calid);
      var r = c.createEvent("sample event for deleting", new Date(2018,0,11,00,00), new Date(2018,0,11,01,00));
    
      // Delete the created new event
      var eventid = r.getId().split('@')[0];
      var event = c.getEventById(eventid);
      event.deleteEvent();
    
      // Your additional script
      var exists = true;
      var response = Calendar.Events.list(
      calid, {
        showDeleted: true,
        fields: "items(id,status,summary)"
        }
      );
      for (var i = 0; i < response.items.length; i++) {
        if (response.items[i].id == eventid && response.items[i].status == "cancelled") {
          exists = false;
          break;
        }
      }
      Logger.log("%s, %s, %s", r.getTitle(), r.getId(), exists)
    }
    

    结果:

    sample event for deleting, #####@google.com, false
    

答案 1 :(得分:1)

Tanaike提供了很大的帮助之后,我已经提出了这段代码片段 - 就我测试的而言 - 现在工作正常。希望它可能对其他用户有所帮助。这是代码片段:

function verifyCalendarEvent(calid, eventid) {
  var cal = CalendarApp.getCalendarById(calid)
  eventid = eventid.split("@")[0];
  var exists = true;
  var eventIds = [];
  var eventStats = [];

  var response = Calendar.Events.list(
  calid, {
    showDeleted: true,
    fields: "items(id,status,summary)"
    }
  );

  for (var i = 0; i < response.items.length; i++) {
    eventIds.push(response.items[i].id);
  }

  for (var i = 0; i < response.items.length; i++) {
    eventStats.push(response.items[i].status);
  }

  if (eventIds.indexOf(eventid) > 0) {
    for (var i = 0; i < eventIds.length; i++) {
      if (eventIds[i] == eventid && eventStats[i] == "cancelled") {
        exists = false;
      }
    }
  } else {
    exists = false;
  }
  Logger.log("Calendar Event ["+eventid+"] exists? >> "+exists);
  return exists;
}