使用 Google Apps 脚本从 Google 基于 Google 工作表的日历中删除事件
Delete Events from Google Calendar based on Google Sheets using Google Apps Script
绝对菜鸟!
背景:
- 我正在尝试创建一个 Google Sheet,我可以为一系列事件更新它
- 根据这些条目创建 Google 日历事件
- 到目前为止,我已成功创建日历事件并使用 EventID (iCalUID) 更新了 sheet 的最后一列 - 感谢其他 Whosebug 帖子
- 通过检查 EventID (iCalUID) 是否已存在于最后一列中,我也成功地不创建重复项 - 再次感谢其他 Whosebug 帖子
但是...还有另一个要求,我失败了:
- 需要在 sheet 和
的其中一列中将现有事件标记为 'Cancelled'
- 如果这是 'true' 则从相应的最后一个单元格(具有 'Cancelled' 条目的那一行)和
中查找 EventID (iCalUID)
- 从日历中删除该特定事件
- 此外,只要该单元格 remains/retains 单词 'Cancelled'.
就不应再次创建日历事件
- 刚刚添加了下面脚本中的“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('myemailid@gmail.com');
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”列不是
Cancelled
且“Y”列为空时,您想创建一个新事件。
- 当“X”列为
Cancelled
且“Y”列不为空时,您想删除现有事件。
- 当“X”列为
Cancelled
时,您不想创建新事件。
这样的话,下面的修改怎么样?
修改后的脚本:
在此脚本中,为了检查事件是否已被删除,使用了日历API。所以 please enable Calendar API at Advanced Google services.
function sync() {
var calendarId = 'myemailid@gmail.com'; // 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 Sheet,我可以为一系列事件更新它
- 根据这些条目创建 Google 日历事件
- 到目前为止,我已成功创建日历事件并使用 EventID (iCalUID) 更新了 sheet 的最后一列 - 感谢其他 Whosebug 帖子
- 通过检查 EventID (iCalUID) 是否已存在于最后一列中,我也成功地不创建重复项 - 再次感谢其他 Whosebug 帖子
但是...还有另一个要求,我失败了:
- 需要在 sheet 和 的其中一列中将现有事件标记为 'Cancelled'
- 如果这是 'true' 则从相应的最后一个单元格(具有 'Cancelled' 条目的那一行)和 中查找 EventID (iCalUID)
- 从日历中删除该特定事件
- 此外,只要该单元格 remains/retains 单词 'Cancelled'. 就不应再次创建日历事件
- 刚刚添加了下面脚本中的“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('myemailid@gmail.com');
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”列不是
Cancelled
且“Y”列为空时,您想创建一个新事件。 - 当“X”列为
Cancelled
且“Y”列不为空时,您想删除现有事件。 - 当“X”列为
Cancelled
时,您不想创建新事件。
这样的话,下面的修改怎么样?
修改后的脚本:
在此脚本中,为了检查事件是否已被删除,使用了日历API。所以 please enable Calendar API at Advanced Google services.
function sync() {
var calendarId = 'myemailid@gmail.com'; // 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();
}
}
}
}