【问题标题】:Delete Events from Google Calendar based on Google Sheets using Google Apps Script使用 Google Apps 脚本从基于 Google 表格的 Google 日历中删除事件
【发布时间】:2021-09-27 23:54:32
【问题描述】:

这里绝对是菜鸟!

背景:

  • 我正在尝试创建一个 Google 表格,我可以针对一系列事件进行更新,并且
  • 根据这些条目创建 Google 日历活动
  • 到目前为止,我成功地创建了日历事件并使用 EventID (iCalUID) 更新了工作表的最后一列 - 感谢其他 stackoverflow 帖子
  • 通过检查最后一列中是否已经存在 EventID (iCalUID) 也成功地不创建重复项 - 再次感谢其他 stackoverflow 帖子

但是...有另一个要求,我失败了:

  • 需要在工作表的某一列中将现有活动标记为“已取消”,并且
  • 如果这是“真”,则从相应的最后一个单元格(具有“已取消”条目的那一行)查找 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('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);
    }
  }
}

【问题讨论】:

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


    【解决方案1】:

    我相信你的目标如下。

    • 您要检查“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();
          }
        }
      }
    }
    

    参考:

    【讨论】:

    • 太棒了!!我无话可说谢谢你!你的编辑就像一个魅力!这对我来说确实是一个很好的学习——我看过一些带有 && Logic 的帖子,iCalUID 使用 .split("@") 删除事件等。但不知何故无法创建一个结合所有这些的工作代码.. .. 再次感谢一吨!我需要至少 15 声望才能投票,但请接受我衷心的感谢 :-)
    • @Abecedarian 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
    • 希望再次寻求您的帮助! Google Calendar API/Apps Script 最近有什么变化吗?我问这个是因为,在您为我修改的相同代码中,过去可以完美地工作,但迟到了,循环在工作表中的第一个(从上到下)“已取消”事件处停止并抛出一个错误,提示“异常:日历活动不存在,或已被删除。”并且无法进一步处理。我找到了一种解决此错误的方法,方法是在执行“deleteEvent”后从最后一列(行 [24])中删除“calendarId”。
    • 有没有更好的方法来继续循环,而无需在 Cancellation 后手动删除“calendarId”?提前谢谢你:-)
    • @Abecedarian 我想支持你。但是回复的问题是新问题,和你的问题不同。那么您可以将其发布为新问题吗?因为当您的初始问题被评论更改时,看到您的问题的其他用户会感到困惑。通过将其发布为新问题,包括我在内的用户都可以想到它。如果你能合作解决你的新问题,我很高兴。你能合作解决你的新问题吗?
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多