Javascript 使用Google脚本将日历事件中的所有数据放入一行数据
我需要检索日历上每个日历事件的所有与会者列表和所有电子邮件,但我希望每个事件的所有数据都在一行中。目前,它为每个事件提供了多行代码 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
函数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
}
}