从日历中检索来宾列表-Google Apps脚本(GAS)

时间:2019-06-05 19:47:52

标签: javascript google-sheets google-api google-calendar-api google-sheets-api

我正在尝试弄清楚如何检索和报告日历事件的详细信息,包括所有来宾及其电子邮件地址。

我也尝试过此操作,有时只检索了一个电子邮件地址:

function getEmailsFromArray(guestsArray){
var guestEmails = [];
for (var i=0;i<guestsArray.length;i++) {
  guestEmails.push(guestsArray[i].getEmail());
}
return guestEmails; }

这是我现在正在使用的代码。救命!

function export_gsheet(){

var mycal = "myemailaddress@mine.com";
var cal = CalendarApp.getCalendarById(mycal);

var events = cal.getEvents(new Date("May 02, 2019 00:00:00 PST"), new Date("May 03, 2019 00:00:00 PST"));

var sheet = SpreadsheetApp.getActiveSheet();

var header = [["Calendar Address", "Event Title", "Event Description", "Calculated Duration", "Attendees", "Email", "MyStatus", "Created By", "All Day Event", "Recurring Event", "Event Location", "Event Start", "Event End", "Visibility", "Date Created", "Last Updated"]]
var range = sheet.getRange(2,1,1,16);
range.setValues(header);


for (var i=0;i<events.length;i++) {
var row=i+3;
var myformula_placeholder = '';

  var guestList=events[i].getGuestList();   //GET THE EMAIL AND STATUS OF EACH GUEST FOR EACH EVENT 
  for(var d=0; guestList!=null && d<guestList.length; d++)
    {
      var details=[[mycal,events[i].getTitle(), events[i].getDescription(), myformula_placeholder, guestList[d].getName(), guestList[d].getEmail(), events[i].getMyStatus(), events[i].getCreators(), events[i].isAllDayEvent(), events[i].isRecurringEvent(), events[i].getLocation(), events[i].getStartTime(), events[i].getEndTime(), ('' + events[i].getVisibility()), events[i].getDateCreated(), events[i].getLastUpdated()]];
      var range=sheet.getRange(row,1,1,16);
      Logger.log(details);

        var range2 = sheet.getRange(row+d,1,1,16);
        range2.setValues(details);

    }
    row=row+d; // increment row to start the next output after the previous output
}
}

该代码大部分都可以使用,但是我没有获得活动的完整来宾列表,有时我得到的是会议室的名称和日历地址。

如果特定事件的来宾名单很大,我也不会在特定日期获得所有事件。

1 个答案:

答案 0 :(得分:0)

问题出在“行”值上,因为它没有按您希望的那样进行迭代。因为每次内部完成时,“行”值都再次设置为3。此外,在内部for的第二次迭代中,“ d”值再次为0,因此您不应将“行”值取决于“ d”值。我修复了它,并为我处理了一天中的所有事件,像这样:

var row=3;
for (var i=0;i<events.length;i++) {

var myformula_placeholder = '';

  var guestList=events[i].getGuestList();   //GET THE EMAIL AND STATUS OF EACH GUEST FOR EACH EVENT 
  for(var d=0; guestList!=null && d<guestList.length; d++)
    {      
      var details=[[mycal,events[i].getTitle(), events[i].getDescription(), myformula_placeholder, guestList[d].getName(), guestList[d].getEmail(), events[i].getMyStatus(), events[i].getCreators(), events[i].isAllDayEvent(), events[i].isRecurringEvent(), events[i].getLocation(), events[i].getStartTime(), events[i].getEndTime(), ('' + events[i].getVisibility()), events[i].getDateCreated(), events[i].getLastUpdated()]];
      var range=sheet.getRange(row,1,1,16);
      Logger.log(details);

        var range2 = sheet.getRange(row,1,1,16);
        range2.setValues(details);
        row++; // increment row to start the next output after the previous output
    }   
}
}

唯一的变化是将“ row = 3”放置在外部,并使用“ row ++”切换“ row = row + d”(并将其放置在内部)。

关于其他问题:

1)资源(会议室)被视为另一位客人,因此,如果您不希望在那里,可以在资源电子邮件中使用“ If”,以避免这种情况发生(它们的电子邮件以@结尾resource.calendar.google.com)。

2)检查您使用的是您想要的确切时区,在这种情况下,您使用的是PST时间,因此日历也应为PST时间。 (或者干脆不放置任何时区,它会占用脚本的相同时区,我想它与日历是相同的。)

修改

您还可以查看有关每个客人的更多信息,请在此处查看文档: https://developers.google.com/apps-script/reference/calendar/event-guest

如果您希望所有者也位于来宾列表中,则必须将getGuestList(true)与内部的布尔值一起使用。说明文件: https://developers.google.com/apps-script/reference/calendar/calendar-event#getguestlist

最后,如果某些被邀请者的姓名没有出现(但应在该行中显示其余信息),可能是因为您没有被授予查看该信息的权限(Google不允许您知道尚未向您发送电子邮件的用户的姓名。