多Google Calendar提取至Google Sheets循环空结果问题排查
代码错误点说明
原代码新增多日历遍历后返回空、运行异常是由以下几个问题导致的:
- 未拆分多日历ID:P1单元格读取到的多日历ID是完整字符串,未按存储时的分隔符(逗号/换行等)拆分为数组,无法通过索引取到单个日历ID
- 拼写错误:循环条件里
mycal.lengh拼写错误,正确属性名为length - 行号变量被覆盖:内层事件循环里每次都重新声明
var row=i+2,重置了外层的行计数,导致所有日历的事件都从第2行开始写入,互相覆盖 - 无效值无容错:如果单个日历ID无效,
getCalendarById返回null时直接调用getEvents会直接抛出错误中断脚本 - 写入字段错误:事件详情第一列写入的是完整的日历ID列表,不是当前遍历的单个日历ID
- 冗余无效代码:循环外提前调用
getCalendarById传入完整ID字符串,该行逻辑完全无效 - 类型兼容问题:
getCreators()返回值为数组,直接写入单元格会触发类型错误
修正后可运行代码
注意:如果P1单元格的日历ID是用换行分隔的,把代码里split(',')改成split('\n')即可
function importMultiCalendarEvents() { var sheet = SpreadsheetApp.getActiveSheet(); // 读取筛选参数 var startDate = sheet.getRange('p7').getValue(); var endDate = sheet.getRange('p8').getValue(); // 读取多日历ID,按逗号拆分后去除每个ID前后的空格 var mycal = sheet.getRange('p1').getValue().toString().split(',').map(id => id.trim()); // 写入表头 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"]] sheet.getRange(1,1,1,14).setValues(header); var writeRow = 2; // 遍历所有日历 for (var j = 0; j < mycal.length; j++){ var currentCalId = mycal[j]; var cal = CalendarApp.getCalendarById(currentCalId); // 跳过无效日历ID,避免报错 if (!cal) continue; var events = cal.getEvents(startDate, endDate); // 遍历当前日历的所有事件 for (var i=0;i<events.length;i++) { var currentEvent = events[i]; var details=[[ currentCalId, currentEvent.getTitle(), currentEvent.getDescription(), currentEvent.getLocation(), currentEvent.getStartTime(), currentEvent.getEndTime(), '', currentEvent.getVisibility().toString(), currentEvent.getDateCreated(), currentEvent.getLastUpdated(), currentEvent.getMyStatus(), currentEvent.getCreators().join(','), currentEvent.isAllDayEvent(), currentEvent.isRecurringEvent() ]]; // 写入当前行事件数据 sheet.getRange(writeRow,1,1,14).setValues(details); // 写入时长计算公式 var durationCell = sheet.getRange(writeRow,7); durationCell.setFormula('=(HOUR(F' + writeRow + ')+(MINUTE(F' + writeRow + ')/60))-(HOUR(E' + writeRow + ')+(MINUTE(E' + writeRow + ')/60))'); durationCell.setNumberFormat('.00'); // 行号自增,下一个事件写下一行 writeRow++; } } }
补充优化建议:如果事件量较大,建议把所有事件数据先存入二维数组,循环结束后一次性调用
setValues写入,能大幅提升脚本运行速度,避免频繁调用表格API触发限流。
内容的提问来源于stack exchange,提问作者Julien
相关产品推荐
相关产品推荐

