google-apps-script - 使用 Google Apps 脚本从基于 Google 表格的 Google 日历中删除事件

标签 google-apps-script google-sheets google-calendar-api google-sheets-api

这里绝对是菜鸟!

背景:

  • 正在尝试创建一个 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/

相关文章:

eclipse - eclipse : Error reading contents of project from Drive; 上的应用程序脚本

firebase - 如何从 Google 表格访问 Cloud Firestore?

date - Google Apps 脚本日期格式问题 (Utilities.formatDate)

google-calendar-api - Google 日历和 Twilio 作为 On-Call

google-apps-script - Google Apps脚本urlfetch编码URL

date - 将字符串时间戳转换为日期会导致重置为 UNIX 纪元

javascript - 使用 GAS 将数据从工作表中的单元格移动到另一个工作表

google-apps-script - Google 电子表格脚本 - 不记录用户电子邮件

java - Google 日历 API Java 403

javascript - 如何在保存时以编程方式将 guest 与会者添加到 GSuite 日历事件