我的整个代码中存在一个非常基本的问题,这个问题在几天内变成了头疼。我已经对这个问题进行了广泛的研究,但无法找到一个确切的解决方案(或者我错过了我可能找到的那个)。这是:
我有一个电子表格,我在其中使用其属性(包括事件的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;
}
答案 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。
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
答案 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;
}