我已经使用Google表格编写了一个内容管理系统,该系统可以将作业写入Google日历。触发器设置为手动运行,因为任何Google触发器都会在范围内发生任何变化时重新填充日历项(我找不到解决方法)。因此,每个项目都有一个唯一的ID。这很好用,尽管如果某些更改您必须再次运行脚本,但该菜单内置在UI中。因此,这还不错。您将看到我还构建了一个用于删除事件的UI菜单项。我也想手动运行它。此CMS有两页:一是正在进行的项目,这是填充项。另一个称为“完成的项目”。它具有所有相同的数据,但是当项目完成时,我有第二个脚本将完成时将其移动到Completed Projects工作表中(这是基于字符串的,我相信目标设置为onEdit,但是它作品)。理想情况下,我想通过使用UI菜单运行脚本(手动触发,坦率地说是我想要的)或在将其移至“完成的项目”表时删除日历项。这就是我遇到问题的地方。
我无法找到找到标识符的逻辑。我当时想,这样做的方法是让它查看已完成文件夹中的唯一ID(项目完成后它会随之移动),然后从UI菜单中手动运行删除操作。如果找到该ID,则应删除日历项目。该脚本出现在两个工作表的第7行(H列)中。我试图使它在该工作表和该行中找到数据,然后使用deleteEvent类调用该值,并在触发脚本时删除事件。该脚本不会产生错误,但是也不会删除日历项。这是代码:
function onOpen(e) {
SpreadsheetApp.getUi()
.createMenu('Calendar Actions')
.addItem('Export Assignments', 'exportEvents')
.addSeparator()
.addItem('Delete Assignments', 'deleteEvents')
.addToUi();
};
function exportEvents() {
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 1;
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "Calendar ID";
var cal = CalendarApp.getCalendarById(calId);
for (i=0; i<data.length; i++) {
if (i < headerRows) continue;
var row = data[i];
var date = new Date(row[4]);
var title = row[0];
var tstart = new Date(row[4]);
var assignee = row [2]
var tstop = new Date(row[5]);
var id = row[7];
try {
var event = cal.getEventSeriesById(id);
}
catch (e) {
}
if (!event) {
var newEvent = cal.createAllDayEvent(title, tstart, tstop, {description:assignee}).getId();
row[7] = newEvent;
}
else {
event.setTitle(title);
event.setDescription(assignee);
var recurrence = CalendarApp.newRecurrence().addDailyRule().times(1);
event.setRecurrence(recurrence, tstart, tstop);
}
debugger;
}
range.setValues(data);
}
function deleteEvents() {
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 1;
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "Calendar ID";
var cal = CalendarApp.getCalendarById(calId);
for (i=0; i<data.length; i++) {
if (i < headerRows) continue;
var row = data[i];
var date = new Date(row[4]);
var title = row[0];
var tstart = new Date(row[4]);
var assignee = row [2]
var tstop = new Date(row[5]);
var id = row[7];
try {
var event = cal.getEventSeriesById(id);
}
catch (e) {
}
if (!event) {
var oldEvent = cal.deleteEvent(title, tstart, tstop, {description:assignee}).getId();
row[7] = oldEvent;
}
}}
有人可以帮我弄清楚我所缺少的内容,因此将其删除了吗?我敢肯定,这只是我没看到的简单事情。谢谢!
答案 0 :(得分:0)
function deleteEvents() {
var sheet=SpreadsheetApp.getActiveSheet();
var headerRows=1;
var range=sheet.getRange(headerRows + 1,1,sheet.getLastRow(),sheet.getLastColumn());
var data=range.getValues();
var cal=CalendarApp.getCalendarById("Calendar ID");
for (i=0;i<data.length;i++) {
if(data[i][7]) {
cal.getEventById(data[i][7]).deleteEvent();
}
}
}