问题描述
因此,我正在开发一个 App Script 模板,该模板允许您查找 Google 日历并将其导出到 Google 电子表格,以便进一步报告或处理(托管于 https://www.cloudbakers.com/blog/export-google-calendar-entries-to-a-google-spreadsheet)。我在我的副本中运行得很好,但我想将 Google Meet 视频会议和 Google Meet Livestream 的网址添加到为每个日历事件输出的列中。在我的公司,这些通常被列为 ConferenceData.entryPoints[].uri 中的第一个和最后一个值。我试过了:
var details=[[mycal,events[i].getTitle(),events[i].getDescription(),events[i].getLocation(),events[i].getStartTime(),events[i].getEndTime(),myformula_placeholder,('' + events[i].getVisibility()),events[i].getDateCreated(),events[i].getLastUpdated(),events[i].getMyStatus(),events[i].getCreators(),events[i].isAllDayEvent(),events[i].isRecurringEvent(),events[i].conferenceData.entryPoints.uri]];
并得到“TypeError:无法从未定义中读取属性“entryPoints””。最后只用 events[i].conferenceData 重新运行,确实只是在我的工作表的新列中打印“未定义”。
关于我在这里缺少什么的任何想法?我是一名 Apps 脚本菜鸟,因此在尝试自行解决此问题时并没有取得多大成功。
解决方法
当您使用 CalendarApp.getEvents(startTime,endTime,options) 获取给定时间范围内的所有事件时,它将返回一个 CalendarEvent 对象数组。 CalendarEvent 对象没有 conferenceData
方法。您可以在提供的参考链接上查看可用的 CalendarEvent 方法列表。
没有可用于获取 Google Meet 和 Google Live Stream URL 的 CalendarEvent 方法。您需要使用 Advanced Calendar Service 来获取此 URL。
先决条件:Enable advanced services
示例代码:
// Create a header record on the current spreadsheet in cells A1:N1 - Match the number of entries in the "header=" to the last parameter
// of the getRange entry below
var header = [["Calendar Address","Event Title","Event Description","Event Location","Event Start","Event End","Calculated Duration","Visibility","Date Created","Last Updated","MyStatus","Created By","All Day Event","Recurring Event","Meet Link","Live Stream"]]
var range = sheet.getRange(1,1,16);
range.setValues(header);
// Loop through all calendar events found and write them out starting on calulated ROW 2 (i+2)
for (var i=0;i<events.length;i++) {
var row=i+2;
var myformula_placeholder = '';
// Matching the "header=" entry above,this is the detailed row entry "details=",and must match the number of entries of the GetRange entry below
// NOTE: I've had problems with the getVisibility for some older events not having a value,so I've had do add in some NULL text to make sure it does not error
var details=[[mycal,events[i].getTitle(),events[i].getDescription(),events[i].getLocation(),events[i].getStartTime(),events[i].getEndTime(),myformula_placeholder,('' + events[i].getVisibility()),events[i].getDateCreated(),events[i].getLastUpdated(),events[i].getMyStatus(),events[i].getCreators(),events[i].isAllDayEvent(),events[i].isRecurringEvent(),"None","None"]];
//Add Meet link
var eventId = events[i].getId().replace("@google.com","");
var currentEvent = Calendar.Events.get(mycal,eventId);
if(currentEvent.conferenceData != null){
//Update Meet link
details[0][14] = currentEvent.conferenceData.entryPoints[0].uri;
//Update Live Stream
if(currentEvent.conferenceData.entryPoints.length > 1){
details[0][15] = currentEvent.conferenceData.entryPoints[currentEvent.conferenceData.entryPoints.length - 1].uri;
}
}
var range=sheet.getRange(row,16);
range.setValues(details);
// Writing formulas from scripts requires that you write the formulas separate from non-formulas
// Write the formula out for this specific row in column 7 to match the position of the field myformula_placeholder from above: foumula over columns F-E for time calc
var cell=sheet.getRange(row,7);
cell.setFormula('=(HOUR(F' +row+ ')+(MINUTE(F' +row+ ')/60))-(HOUR(E' +row+ ')+(MINUTE(E' +row+ ')/60))');
cell.setNumberFormat('.00');
}
它有什么作用?
- 在您的
header
变量中添加额外的工作表标题(“Meet Link”和“Live Stream”) - 在您的
details
变量中为会议链接和直播链接添加额外的默认值 - 从事件的 iCalUID 中获取日历事件 ID。 CalendarEvent.getId() 返回事件的 iCalUID。我们只需要删除 iCalUID 中的“@google.com”即可获取事件 ID。
请注意,日历 v3 API 和日历高级服务使用的 iCalUID 和事件 ID 不相同,不能互换使用
- 使用 Calendar.Events.get(calendarId: string,eventId: string) 获取包含
conferenceData
(如果可用)的 event resource - 检查
conferenceData
是否存在,根据details
参数更新entryPoints[]
变量。 - 将事件详细信息写入活动工作表