使用Google应用脚本编辑Google日历活动时更新与会者

时间:2014-03-05 02:06:37

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

情况

我有一个日历上有很多活动(员工评估)。

我做了很多修改(改变了事件的长度等),但邀请函是给有莲花笔记日历的人(穷人)。

这意味着除非我触发所谓的“发送通知”?在点击鼠标版本的东西中,他们无法知道事件已经更新。

Similar Q

example of the update triggering

在此示例中,我尝试触发的事件与发送接受发送更新?模式时触发的事件相同。

代码

以下是一些示例代码,可以获取Appraisals日历上的所有事件,并将其位置更改为“月亮”。

function fixInvitations(){
  //get the callendar named "Appraisals"
  var cApp = CalendarApp.getCalendarsByName("Appraisals")[0];
  var events = cApp.getEvents(new Date(), new Date("Dec 30 2014"));

  for (eIndex in events){
    var event = events[eIndex];
    event.setLocation("the moon");
  }
}

问题

如何触发对受邀参加活动的所有各方的更新,以便更改反映在他们的日历中?

目前这些活动现已登上月球,但更新并未告知非谷歌日历上有关此更改的人。

有帮助,但没有那么有用的事实

手动触发发送的更新电子邮件包含.ics文件(Gist of the contents)。它包含一个VCALENDAR和一个VEVENT。来自Wikipedia page on VEVENTs

  

为了发送事件的UPDATE,UID应该与原始UID匹配。要设置的其他组件属性是:

     

SEQUENCE:<Num of Update>

     

即,第一次更新:

     

SEQUENCE:1

因此,如果有一种方法可以手动构建一个带有.ics附件的电子邮件,那么它可以解决问题,但这感觉就像是大规模的过度杀伤。 This is mentioned here但未解决。

4 个答案:

答案 0 :(得分:2)

Google Calendar API支持事件更新的标记sendNotifications: https://developers.google.com/google-apps/calendar/v3/reference/events/update

我会提交App Script的功能请求以显示该标志,同时直接使用Calendar API来更新事件,就像外部API一样: https://developers.google.com/apps-script/guides/services/external

答案 1 :(得分:2)

我正在努力解决这个问题并从ekoleda+devrel@google.com获得一些帮助:日历能够向通过addGuest添加的用户发送电子邮件邀请http://code.google.com/p/google-apps-script-issues/issues/detail?id=574

有几个指示希望能节省一些时间:

  

请注意,CalendarApp和高级日历服务使用不同的内容   事件ID格式:

     
    
        
  • CalendarApp在结尾处返回带有“@ google.com”的活动ID。 b3gv ... a5jrs@google.com
  •     
  • 高级日历服务/ Calendar API需要一个没有@ google.com ex的事件ID。 b3gv ... a5jrs
  •     
  

这是一些有效的代码:

function sendInvite(calendarId, eventId, email) {
  var event = Calendar.Events.get(calendarId, eventId);
  if(event.attendees) {
    event.attendees.push({
      email: email
    });
  } else {
    event.attendees = new Array({email: email});
  }
  event = Calendar.Events.patch(event, calendarId, eventId, {
    sendNotifications: true
  });
}

对于跟随者的最后一个注意事项 - 如果您是活动所有者并且您尝试添加自己的电子邮件地址,则不会收到电子邮件通知。这在日历世界中是有意义的,因为您不会进入自己的日历活动,将自己添加为与会者,并期望提示您是否要通知自己。但是,它可能是人们尝试和测试事物的常用方式(我没有域测试帐户,我不能总是使用我的个人Gmail帐户可靠地测试事物)。因此,如果您使用自己的帐户进行测试并认为某些操作无效,请牢记这一点。一旦您尝试使用非活动所有者帐户,邀请将通过电子邮件发送。

答案 2 :(得分:1)

我认为一种解决方案是创建一个包含列标题的电子表格:事件ID,事件名称,描述,开始时间,结束时间,位置,访客列表,然后将此脚本添加到电子表格中。 calendarImport()将导入所有日历事件并将其写入工作表。然后,您可以在电子表格行中修改事件(将位置更改为月球),然后运行calendarCreateEvent以根据您所做的更改创建新事件。它会自动向所有旧参与者发送通知以接受新活动,因为这是一个新邀请。

我非常接近这个解决方案,但现在,在访问日历以创建新事件时我有一个挂机。我认为这是因为我从onEdit事件函数调用它。现在已经很晚了,但是如果你重写脚本的第三部分来获取事件数据范围,那么一个for / if循环来检查添加的和修改的日期,那么你应该能够创建一个新的事件,并删除旧的事件。这会将事件详细信息更改的通知推送给已经接受旧事件的所有人。

我认为,考虑到你在开头提到的代码示例,你可能已经知道如何做到这一点,但如果你不这样做,我可能会在明天晚上一起扔东西来搜索已经重新创建的旧事件并删除它们。

Here's my spreadsheet and code in action.

function calendarImport(){
  //http://www.google.com/google-d-s/scripts/class_calendar.html#getEvents
  // The code below will retrieve events between 2 dates for the user's default calendar and
  // display the events the current spreadsheet
  var cal = CalendarApp.getDefaultCalendar();
  var calId = cal.getId();
  var sheet = SpreadsheetApp.getActiveSheet();
  var sheetName = SpreadsheetApp.getActiveSheet().setName(calId +" Calendar Data");
  var events = cal.getEvents(new Date("March 9, 2014"), new Date("March 14, 2014"));
  for (var i=0;i<events.length;i++) {
    //http://www.google.com/google-d-s/scripts/class_calendarevent.html
    Logger.log(events);
    var details=[[events[i].getId(),events[i].getTitle(), events[i].getDescription(), events[i].getStartTime(), events[i].getEndTime(),events[i].getLocation()]];
    var guestList = events[i].getGuestList();
    var guestArray = [];
    for (var n in guestList){
      var guestEmail = (guestList[n].getEmail());
      guestArray.push(guestEmail);
      Logger.log(guestArray);

    }

    var row=i+1;
    var range=sheet.getRange(row+1,1,1,6);
    range.setValues(details);
    var guestRange = sheet.getRange(row+1,7,1,1);
    guestRange.setValues([guestArray]);
    var dateAdded = Utilities.formatDate(new Date(), "GMT-6","MM/dd/yy HH:mm:ss");
    var dateAddedRange = sheet.getRange(row+1,8,1,1);
    dateAddedRange.setValue(dateAdded);
  }
}

function onEdit(event){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var calId = CalendarApp.getDefaultCalendar().getId();
  var sh = ss.getSheetByName(sheetName);
  var actSht = event.source.getActiveSheet();
  var actRng = event.source.getActiveRange();
  var index = actRng.getRowIndex();
  Logger.log(index);
  var dateCol = actSht.getLastColumn();
  var calId
  var lastCell = actSht.getRange(index,dateCol);
  var date = Utilities.formatDate(new Date(), "GMT-6", "MM/dd/yyyy HH:mm:ss");
  lastCell.setValue(date);
  var modifiedRow = sh.getRange(index,1,1,ss.getLastColumn()).getValues();
  Logger.log(modifiedRow[0][7])
  if (modifiedRow[0][7] < modifiedRow[0][8]){
    var firstAdded = modifiedRow[0][7];
    var dateModified = modifiedRow[0][8];
    calendarCreateEvent(index,firstAdded,dateModified,calId);
  }


}

function calendarCreateEvent(index,firstAdded,dateModified,calId){
  var sheet = SpreadsheetApp.getActiveSheet();
  var added = firstAdded;
  var modified = dateModified;
  var startRow = index;  // First row of data to process
  var calId = calId;
  Logger.log(calId);
  Logger.log(startRow);
  Logger.log(added);
  Logger.log(modified);
  if (modified - added > "0"){
    var numRows = 1;   // Number of rows to process
    var dataRange = sheet.getRange(startRow, 1, numRows, 9);
    var data = dataRange.getValues();
    var cal = CalendarApp.getCalendarById(calId);
    for (i in data) {
      var row = data[i];
      var eventId = row[0]
      var title = row[1];  // First column
      var desc = row[2];       // Second column
      var tstart = row[3];
      var tstop = row[4];
      var loc = row[5];
      var guests = row[6];
      //cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
      var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc, guests:guests});//.addGuest(guests);
      var newEventId = newEvent.getId();
      Logger.log(newEventId);

    }
  }
}

答案 3 :(得分:0)

我今天收到一封来自Gooogle的电子邮件,称他们已经为应用脚本添加了一项功能,可以实现这一目标。

  

更新:           状态:已修复           所有者:ekoleda+devrel@google.com           标签:-Priority-Medium

     

关于问题574的评论#11 ekoleda+devrel@google.com:日历能够向通过addGuest添加的用户发送电子邮件邀请   http://code.google.com/p/google-apps-script-issues/issues/detail?id=574

     

现在可以使用高级日历服务:

     

https://developers.google.com/apps-script/advanced/calendar

     

您可以使用Calendar.Events.patch()添加与会者,如果将可选参数sendNotifications设置为“true”,则与会者将获得邀请。

     

https://developers.google.com/google-apps/calendar/v3/reference/events/patch

我今天将尝试解决此问题,然后编辑此响应以反映出来。