这里绝对是菜鸟!
背景:
- 正在尝试创建一个 Google 表格,我可以根据一系列事件更新该表格
- 根据这些条目创建 Google 日历事件
- 到目前为止,我成功创建了日历事件,并使用 EventID (iCalUID) 更新了工作表的最后一列 - 感谢其他 stackoverflow 帖子
- 通过检查最后一列中是否已存在 EventID (iCalUID),我还成功地避免了创建重复项 - 再次感谢其他 stackoverflow 帖子
但是...还有另一个要求,但我失败了:
- 需要在工作表的某一列中将现有事件标记为“已取消”,并且
- 如果这是“true”,则从相应的最后一个单元格(具有“已取消”条目的该行)查找 EventID (iCalUID),并且
- 从日历中删除该特定事件
- 此外,只要该单元格保留/保留“已取消”一词,就不应再次创建日历事件。
- 下面脚本中的“var check1 = row[23];//Booked/Blocked/Cancelled”只是添加来引入我想要的逻辑,但我有点无法继续
Relevant screen-shot of the sheet
我到目前为止使用的代码如下:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Sync to Calendar')
.addItem('Sync Now', 'sync')
.addToUi();
}
function sync() {
var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
var calendar = CalendarApp.getCalendarById('<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c5a8bca0a8a4aca9aca185a2a8a4aca9eba6aaa8" rel="noreferrer noopener nofollow">[email protected]</a>');
var startRow = 2; // First row from which data should process > 2 exempts my header row
var numRows = sheet.getLastRow(); // Number of rows to process
var numColumns = sheet.getLastColumn();
var dataRange = sheet.getRange(startRow, 1, numRows-1, numColumns);
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var name = row[1]; //Name of Guest
var place = row[4]; //Add2
var room = row[9]; //Room Number
var inDate = new Date(row[10]); //Check-In Date
var outDate = new Date(row[11]); //Check-Out Date
var check1 = row[23]; //Booked/Blocked/Cancelled
var check2 = row[24]; //Event created and EventID (iCalUID) populated
if (check2 == "") {
var currentCell = sheet.getRange(startRow + i, numColumns);
var event = calendar.createEvent(room, inDate, outDate, {
description: 'Booked by: ' + name + ' / ' + place + '\nFrom: ' + inDate + '\nTo: ' + outDate
});
var eventId = event.getId();
currentCell.setValue(eventId);
}
}
}
最佳答案
我相信您的目标如下。
- 您想要检查“X”和“Y”列。
- 当“X”列未
已取消
并且“Y”列为空时,您想要创建一个新事件。 - 当“X”列
已取消
并且“Y”列不为空时,您想要删除现有事件。 - 当“X”列
已取消
时,您不想创建新事件。
既然如此,下面的修改如何?
修改后的脚本:
在此脚本中,为了检查事件是否已被删除,使用了 Calendar API。所以please enable Calendar API at Advanced Google services .
function sync() {
var calendarId = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2b46524e464a4247424f6b4c464a424705484446" rel="noreferrer noopener nofollow">[email protected]</a>'; // Please set your calendar ID.
var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
var calendar = CalendarApp.getCalendarById(calendarId);
var startRow = 2; // First row from which data should process > 2 exempts my header row
var numRows = sheet.getLastRow(); // Number of rows to process
var numColumns = sheet.getLastColumn();
var dataRange = sheet.getRange(startRow, 1, numRows - 1, numColumns);
var data = dataRange.getValues();
var done = "Done"; // It seems that this is not used.
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var name = row[1]; //Name of Guest
var place = row[4]; //Add2
var room = row[9]; //Room Number
var inDate = new Date(row[10]); //Check-In Date
var outDate = new Date(row[11]); //Check-Out Date
var check1 = row[23]; //Booked/Blocked/Cancelled
var check2 = row[24]; //Event created and EventID (iCalUID) populated
// I modified below script.
if (check1 != "Cancelled" && check2 == "") {
var currentCell = sheet.getRange(startRow + i, numColumns);
var event = calendar.createEvent(room, inDate, outDate, {
description: 'Booked by: ' + name + ' / ' + place + '\nFrom: ' + inDate + '\nTo: ' + outDate
});
var eventId = event.getId();
currentCell.setValue(eventId);
} else if (check1 == "Cancelled" && check2 != "") {
var status = Calendar.Events.get(calendarId, check2.split("@")[0]).status;
if (status != "cancelled") {
calendar.getEventById(check2).deleteEvent();
}
}
}
}
引用:
关于google-apps-script - 使用 Google Apps 脚本从基于 Google 表格的 Google 日历中删除事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69354337/