Javascript 使用Google脚本将日历事件中的所有数据放入一行数据

Javascript 使用Google脚本将日历事件中的所有数据放入一行数据,javascript,email,google-apps-script,calendar,Javascript,Email,Google Apps Script,Calendar,我需要检索日历上每个日历事件的所有与会者列表和所有电子邮件,但我希望每个事件的所有数据都在一行中。目前,它为每个事件提供了多行代码 Google工作表中的当前输出: 谷歌表单中的所需输出: 下面是我的代码: 函数testImportCal(){ var sh1=SpreadsheetApp.openById('Mycal12345678')。getSheetByName('Calendar Import')。getRange('A:I'); sh1.clearContent(); var m

我需要检索日历上每个日历事件的所有与会者列表和所有电子邮件,但我希望每个事件的所有数据都在一行中。目前,它为每个事件提供了多行代码

Google工作表中的当前输出:

谷歌表单中的所需输出:

下面是我的代码:

函数testImportCal(){
var sh1=SpreadsheetApp.openById('Mycal12345678')。getSheetByName('Calendar Import')。getRange('A:I');
sh1.clearContent();
var mycal=mycal@gmail.com';
var cal=CalendarApp.getCalendarById(mycal);
var events=cal.getEvents(新日期('2020年11月10日00:00:00太平洋标准时间')、新日期('2020年12月20日00:00:00太平洋标准时间');
var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“日历导入”);
var header=[[“事件标题”、“事件描述”、“与会者”、“与会者电子邮件”、“创建人”、“事件开始”、“事件结束”、“创建日期”、“上次更新”];
var范围=sheet.getRange(1,1,1,9);
范围。设置值(标题);
函数getEmailsFromArray(GuestArray){
var guestEmails=[];
对于(变量i=0;i
您多次得到它,因为您在循环中使用了
setValues()
,循环遍历来宾,因此添加相同事件的次数与来宾的次数相同

因此,您可能应该将
setValues()
移动到循环外部。事实上,如果使用以下命令,则不需要执行显式循环:

函数testImportCal(){
var sheet=SpreadsheetApp.openById('sheet_ID')。getSheetByName('Calendar Import');
sheet.clearContents();
var mycal=‘日历_ID’;
var cal=CalendarApp.getCalendarById(mycal);
var events=cal.getEvents(新日期('2020年11月10日00:00:00太平洋标准时间')、新日期('2020年12月20日00:00:00太平洋标准时间');
//var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“日历导入”);
var header=[[“事件标题”、“事件描述”、“与会者”、“与会者电子邮件”、“创建人”、“事件开始”、“事件结束”、“创建日期”、“上次更新”];
var范围=sheet.getRange(1,1,1,9);
范围。设置值(标题);
函数getEmailsFromArray(GuestArray){
var guestEmails=[];
对于(变量i=0;iguest.getName()、events[i].getGuestList().map(guest=>guest.getEmail())、events[i].getStartTime()、events[i].getEndTime()、events[i].GetLastUpdate();
var范围=sheet.getRange(第1、1、9行);
Logger.log(详细信息);
var range2=sheet.getRange(第1、1、1、9行);
范围2.设定值(详细信息);
row++;//递增row以在上一个输出之后开始下一个输出
}
}

作为旁注,这里有许多不必要的代码,因此您可能希望删除它们以使其更易于理解。:)

您的主要问题是,您对每个来宾进行了多次迭代,并使用每个来宾的信息插入了相同的事件。要解决这个问题,您需要将
详细信息
移动到来宾循环之外,并将来宾存储在一个数组中。然后,您只需使用javascript方法将该数组转换为字符串,就可以得到一个逗号分隔的数组元素字符串

在下面的代码中,我在注释中详细解释了我所采取的流程(修改点位于注释后面):

注意:我已经删除了您没有执行任何特定功能的不必要的代码行

函数testImportCal(){
var sh1=SpreadsheetApp.openById('SHEETID')。getSheetByName('SHEETNAME')。
function testImportCal() {
  var sheet = SpreadsheetApp.openById('SHEET_ID').getSheetByName('Calendar Import');
  sheet.clearContents();
  var mycal = 'CALENDAR_ID';
  var cal = CalendarApp.getCalendarById(mycal);

  var events = cal.getEvents(new Date('November 10, 2020 00:00:00 PST'), new Date('December 20, 2020 00:00:00 PST'));

  
  //var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Calendar Import');

  var header = [['Event Title', 'Event Description', 'Attendees', 'Attendees Email', 'Created By', 'Event Start', 'Event End', 'Date Created', 'Last Updated']];
  var range = sheet.getRange(1, 1, 1, 9);
  range.setValues(header);

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

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

    //Logger.log('Event ' + i + ': ' + events[i].getId());

    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++) {
//      guestEmail = guestList[d].getEmail();
//      guestName = guestList[d].getName();
//      Logger.log('Guest ' + d + ': ' + guestList[d].getEmail());
//
//      var details = [[events[i].getTitle(), events[i].getDescription(), guestList[d].getName(), guestList[d].getEmail(), events[i].getCreators(), events[i].getStartTime(), events[i].getEndTime(), events[i].getDateCreated(), events[i].getLastUpdated()]];
//      var range = sheet.getRange(row, 1, 1, 9);
//      Logger.log(details);
//
//      var range2 = sheet.getRange(row - 1, 1, 1, 9);
//      range2.setValues(details);
//      row++; // increment row to start the next output after the previous output
//    }
    var details = [[events[i].getTitle(), events[i].getDescription(), events[i].getGuestList().map(guest => guest.getName()), events[i].getGuestList().map(guest => guest.getEmail()), events[i].getCreators(), events[i].getStartTime(), events[i].getEndTime(), events[i].getDateCreated(), events[i].getLastUpdated()]];
    var range = sheet.getRange(row, 1, 1, 9);
    Logger.log(details);
    
    var range2 = sheet.getRange(row - 1, 1, 1, 9);
    range2.setValues(details);
    row++; // increment row to start the next output after the previous output
  }
}