检查 Google 日历事件是否存在

Checking a Google Calendar Event's Existence

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

我有一个传播sheet,我在其中登录 Google 日历事件及其属性,包括事件 ID。有时,我手动清理 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
  }
}

基本上,如果事件在日历中,代码应先将其删除,然后清除 sheet,如果不存在,则应仅清除 sheet。但是,当执行代码时,虽然日历事件不存在,但 if 语句 return 为真并在尝试删除事件时引发错误,因为它实际上不存在。尽管事件不存在,但我一直无法找出 event object return true 的原因、方式和原因.我哪里做错了??感谢您的回复,非常感谢您的帮助。

[编辑] 这是我使用日历 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;
}

这个答案怎么样?

修改点:

例如,如果没有事件ID的事件,CalendarApp.getOwnedCalendarById(calid).getEventById(eventid) returns null。当它被 if 评估时,它被用作 false.

所以我认为您可以尝试检索已删除的事件。因为在 Google Calendar,即使事件被移除,事件 ID 仍然存在。所以虽然没有事件ID的事件,if (event) {}在你的脚本returnstrue。我确认 CalendarApp.getOwnedCalendarById(calid).getEventById(eventid) 检索已删除的事件。对于这种情况,您可以通过确认事件状态来了解该事件是否被移除。

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

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

当您使用此修改后的脚本时,请在高级 Google 服务和 API 控制台启用日历 API。

在高级 Google 服务中启用日历 API v3

  • 在脚本编辑器上
    • 资源 -> 高级 Google 服务
    • 打开日历 API v3

Enable Calendar API at API console

  • 在脚本编辑器上
    • 资源 -> 云平台项目
    • 查看API控制台
    • 在开始时,单击启用 APIs 并获取密钥等凭据。
    • 在左侧,单击“库”。
    • 在搜索 API 和服务时,输入 "Calendar"。然后单击日历 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. 确认删除的活动。
    • 此处使用了您的附加脚本。

示例脚本:

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

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;
}