检查 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
。由于我不知道你的情况,所以我准备了一个示例脚本。此示例脚本是一个简单的流程。
- 创建新活动。
- 删除创建的活动。
- 确认删除的活动。
- 此处使用了您的附加脚本。
示例脚本:
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;
}
我的整个代码中有一个非常基本的问题,这让我头疼了几天。我对这个问题进行了广泛的研究,但是无法找到确切的解决方案( 或者我错过了我可能找到的解决方案)。这是:
我有一个传播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
。由于我不知道你的情况,所以我准备了一个示例脚本。此示例脚本是一个简单的流程。
- 创建新活动。
- 删除创建的活动。
- 确认删除的活动。
- 此处使用了您的附加脚本。
示例脚本:
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;
}