You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:48:13