向Google日历活动添加多个访客会引发错误

时间:2012-10-05 20:09:36

标签: google-apps-script

  • 我正在尝试邀请小组成员批量生成日历活动
  • 如果我使用其电子邮件邀请该群组,则该群组会在事件中被分割(这是正常的),但邀请未经过“验证”...我可以在日历界面中手动验证它们,但这不是解决方案。最后,即使他们的名字出现在活动中,也不会邀请来宾。如果我不手动“保存”此活动,则日志会将小组仅显示为来宾,不是其用户

所以我尝试使用下面的脚本单独添加每个guest虚拟机,但是我收到一个我不理解的错误enter image description here 在第一个事件成功发出可变数量的邀请之后出现错误...有时只有一个,有时是2个或3个或5个......随机发生。

这是在域上的Google Apps应用教育帐户上运行的。我有管理员权限,我对日历拥有所有权利。

以下是相关功能的代码:(获取小组成员,邀请他们参加一段时间内的每个活动,在新工作表上打印出结果日志。)

function sendinvites(e) {
  var calendar_name = e.parameter.calendar;
  var email = calendar_name.toLowerCase()+'@insas.be';
  var group = GroupsManager.getGroup(email);
  var members = group.getAllMembers();
  var startDate = new Date(e.parameter.start);
  var endDate = new Date(e.parameter.end);
  var Calendar = CalendarApp.getCalendarsByName(calendar_name);
  var sheetName = calendar_name + "-du-" + Utilities.formatDate(e.parameter.start, FUS1, "dd-MMM-yyyy")
      + "-au-" + Utilities.formatDate(e.parameter.end, FUS1, "dd-MMM-yyyy")  
// 
  var events = Calendar[0].getEvents(startDate , endDate);
  if (events[0]) {
    var eventarray = new Array();
    var line = new Array();
    line.push('Titre : '+calendar_name,'Début ','Fin','Localisation','Durée','invités');
    eventarray.push(line);

    for (i = 0; i < events.length; i++) {
      if(events[i].getTitle().match('semaine n')=='semaine n'){continue}
    var lr = logsheet.getLastRow(); // these lines are added here for test purpose only, to see where in the loop it fails... that's why I set values cell by cell !
      logsheet.getRange(lr+1,1).setValue(events[i].getTitle()+' / '+Utilities.formatDate(events[i].getStartTime(), FUS1, "dd-MMM-yyyy"));
      for(nn=0;nn<members.length;++nn){
        logsheet.getRange(lr+1,nn+2).setValue(members[nn]);  
        events[i].addGuest(members[nn])
            }
      line = new Array();
      line.push(events[i].getTitle());
      line.push(Utilities.formatDate(events[i].getStartTime(), FUS1, "dd-MMM-yyyy")+' à ' +Utilities.formatDate(events[i].getStartTime(), FUS1, "HH:mm"));
      line.push(Utilities.formatDate(events[i].getEndTime(), FUS1, "dd-MMM-yyyy")+' à ' +Utilities.formatDate(events[i].getEndTime(), FUS1, "HH:mm"));
      line.push(events[i].getLocation());
      line.push((events[i].getEndTime() - events[i].getStartTime()) / 3600000);
      var invitelist='';
      var list = events[i].getGuestList()
          for(nn=0;nn<list.length;++nn){invitelist+=list[nn].getName()+', '}
      line.push(invitelist)
      eventarray.push(line);
    }
    Logger.log(eventarray)
    var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);
    sheet.getRange(1,1,eventarray.length,eventarray[0].length).setValues(eventarray);
    sheet.getRange(1,1,1,eventarray[0].length).setBackgroundColor('#ffffcc');
    sheet.setColumnWidth(1, 450);sheet.setColumnWidth(2, 150);sheet.setColumnWidth(3, 150);sheet.setColumnWidth(4, 250);sheet.setColumnWidth(5, 75);sheet.setColumnWidth(6, 450);;
    sheet.setFrozenRows(1)
  } else {
    var startstring = Utilities.formatDate(e.parameter.start, FUS1, "dd-MMM-yyyy");
    var endstring = Utilities.formatDate(e.parameter.end, FUS1, "dd-MMM-yyyy");
    Browser.msgBox('Aucun événement entre le ' + startstring + ' et le ' + endstring +' dans votre agenda :'+calendar_name);
  }

  var app = UiApp.getActiveApplication();
  app.close();
  return app;  
}

所以我的问题是:这是正确的方法吗?我应该通过电子邮件邀请小组吗?在这种情况下,如何自动将这个小组分成每个日历?

有没有人遇到这种情况?

我有点被困在这里: - /

参考:issue tracker 1906合并with 264查看详细信息

2 个答案:

答案 0 :(得分:0)

根据http://code.google.com/p/google-apps-script-issues/issues/detail?id=264#c40

This exception error is not a bug. 
This issue occurs only when one event is being modified by multiple parties simultaneously. 
It is thrown intentionally to prevent a loss of data.

尝试在脚本的各个部分之间使用睡眠代码:

Utilities.sleep(2000);

答案 1 :(得分:0)

阅读问题跟踪器似乎有一个解决此问题的工作方法是每次单独获取事件并一次添加一个访客。

非常慢,但显然没有错误运行(截至目前; - )

我希望Google会改变这种行为,因为它非常不舒服!!

代码太慢了,它在20个有15位客人的事件后超时...非常高兴,我添加的日志表告诉我它停止的位置和我用来设置日期的UI即使在超时后也保持打开状态。我猜我会在接下来的几天里喝很多咖啡,等待从9月份到6月份的20个日历! ;-P


这里是修改后的代码(已更改的部分内容)

for (i = 0; i < events.length; i++) {
  if(events[i].getTitle().match('semaine n')=='semaine n'){continue}
    var ID = events[i].getId(); // get the ID to be able to recall the event later
var lr = logsheet.getLastRow();
  logsheet.getRange(lr+1,1).setValue(events[i].getTitle()+' / '+Utilities.formatDate(events[i].getStartTime(), FUS1, "dd-MMM-yyyy"));
  for(nn=0;nn<members.length;++nn){
    logsheet.getRange(lr+1,nn+2).setValue(members[nn]);  
    Calendar[0].getEventSeriesById(ID).addGuest(members[nn]);// separately get each event and add guest
  }
  line = new Array();
  line.push(events[i].getTitle());
  line.push(Utilities.formatDate(events[i].getStartTime(), FUS1, "dd-MMM-yyyy")+' à ' +Utilities.formatDate(events[i].getStartTime(), FUS1, "HH:mm"));
  line.push(Utilities.formatDate(events[i].getEndTime(), FUS1, "dd-MMM-yyyy")+' à ' +Utilities.formatDate(events[i].getEndTime(), FUS1, "HH:mm"));
  line.push(events[i].getLocation());
  line.push((events[i].getEndTime() - events[i].getStartTime()) / 3600000);
  var invitelist='';
  var list = Calendar[0].getEventSeriesById(ID).getGuestList()
      for(nn=0;nn<list.length;++nn){invitelist+=list[nn].getName()+', '}
  line.push(invitelist)
  eventarray.push(line);
}
相关问题