[英]Putting all data from a Calender event into one row of data using Google scripts
我需要為我的日歷上的每個日歷事件檢索所有與會者和所有電子郵件的列表,但我希望每個事件的所有數據都在一行中。 目前它為每個事件提供了多行。
Google表格中的當前Output:
Google表格中所需的output:
下面是我的代碼:
function 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(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
}
}
}
您會多次獲得它,因為您在循環中使用setValues()
迭代來賓,因此您添加相同事件的次數與來賓次數一樣多。
因此,您可能應該將該setValues()
移到循環之外。 事實上,如果您使用map() ,則不需要執行顯式循環:
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
}
}
附帶說明一下,那里有很多不必要的代碼,因此您可能希望將其刪除以使其更易於理解。 :)
您的主要問題是您正在迭代每位客人並多次插入相同的事件和每位客人的信息。 為了解決這個問題,您需要將您的details
和setValues()移到來賓循環之外,並將來賓存儲在一個數組中。 然后,您可以簡單地使用 javascript 方法toString()將此數組轉換為字符串,您將獲得數組元素的逗號分隔字符串。
在下面的一段代碼中,我在評論中解釋了我采取的更詳細的過程(修改點在注釋之后):
注意:我已經刪除了您沒有執行任何特定 function 的不必要的代碼行。
function testImportCal() { var sh1 = SpreadsheetApp.openById('SHEETID').getSheetByName('SHEETNAME').getRange('A:I'); sh1.clearContent(); var mycal = 'CALENDARID'; 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('SHEETNAME'); 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); var row = 3; //////////////////////// MODIFICATIONS //////////////////////// for (var i = 0; i < events.length; i++) { var guestList = events[i].getGuestList(); // Initialise guest detail arrays to store the information of all guests var guestEmail=[]; var guestName=[]; //GET THE EMAIL AND STATUS OF EACH GUEST FOR EACH EVENT (no need to check if they are null with this array implementation) for (var d = 0;d < guestList.length; d++) { // Add the email and name to their corresponding arrays guestEmail.push(guestList[d].getEmail()); guestName.push(guestList[d].getName()); } // After the loop is done add the event details // NOTE that for the guest lists we are converting our arrays into strings which will automatically separate each element with a comma var details = [[events[i].getTitle(), events[i].getDescription(), guestName.toString(), guestEmail.toString(), events[i].getCreators(), events[i].getStartTime(), events[i].getEndTime(), events[i].getDateCreated(), events[i].getLastUpdated()]]; var range = sheet.getRange(row, 1, 1, 9); var range2 = sheet.getRange(row - 1, 1, 1, 9); range2.setValues(details); row++; // increment row to start the next output after the previous output } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.