Google Apps Script搜索字面逗号筛选日历事件的实现方法
问题背景
- 开发场景:通过Google Apps Script脚本从Google Calendar检索日程项,写入Google Sheets。待提取的日历项标题采用逗号分隔格式,示例为 Client, Project, Activities.
- 核心需求:仅筛选标题中包含2个逗号(逗号间可存在任意字符)的日程项
- 遇到的问题:调用
CalendarApp.getEvents()方法时,search参数传入普通关键词可正常过滤结果,但传入逗号等特殊字符无匹配结果,尝试正则表达式等数十种参数组合均未生效。
初始问题代码
function getCalendarEvents() { var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Brondata"); var cal = CalendarApp.getCalendarById("mail@domain."); var eind = new Date; eind.setDate(eind.getDate()+1); var events = cal.getEvents(new Date("1/1/2022"), eind, {search: '(/,{2}/)'}); var lr = ss.getLastRow(); ss.getRange(3, 1, lr,14).clearContent(); var result = [] events.forEach(e => { result.push([e.getStartTime(), e.getEndTime(), e.getTitle(), e.getDescription(), e.getDateCreated(), e.getLastUpdated(), e.isRecurringEvent(), e.getCreators()]) }) ss.getRange(3,1,result.length,result[0].length).setValues(result) }
已尝试的无效search参数写法
所有传入search参数的写法均未达到预期效果:
'\,':未返回任何过滤结果'==\,':未返回任何过滤结果'"\,"':返回的过滤结果不符合预期,无法判定其匹配逻辑'"==\,"':过滤结果与上一写法一致
可正常运行的实现方案
参考@TheWizEd的建议调整逻辑后,脚本可正常筛选目标日程,核心调整是放弃在search参数中直接匹配特殊字符,先拉取指定时间范围的全量日程,再通过正则对标题做二次过滤,完整可运行代码如下:
function getCalendarEvents() { let ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Brondata"); let cal = CalendarApp.getDefaultCalendar(); let eind = new Date(); eind.setDate(eind.getDate()+1); // 不传search参数,拉取全量时间范围内的日程 let events = cal.getEvents(new Date("1,1,2022"), eind); let lr = ss.getLastRow(); ss.getRange(3, 1, lr,14).clearContent(); let result = [] // 二次过滤:匹配标题中包含至少2个逗号的日程 let match = events.filter( e => { if( e.getTitle().match(".*\,.*\,") !== null ) return e; } ); if( match ) { match.forEach(e => { result.push([e.getStartTime(), e.getEndTime(), e.getTitle(), e.getDescription(), e.getDateCreated(), e.getLastUpdated(), e.isRecurringEvent(), e.getCreators()]) }) ss.getRange(3,1,result.length,result[0].length).setValues(result) } }
问题解答
getEvents方法的search参数不支持特殊字符匹配、也不支持正则语法,不存在任何参数写法可以直接通过search字段筛选出标题含逗号的日历项,必须采用「拉取全量日程+本地正则过滤」的方案实现需求。
用于匹配标题包含至少2个逗号的正则规则可直接使用/.*,.*,/,逗号属于普通字符,无需额外转义。
内容的提问来源于stack exchange,提问作者Marc van Maastricht
相关产品推荐
相关产品推荐

