使用Google Apps Script批量导入日历事件遇Bad Request错误求助
排查Google Calendar导入CSV时的Bad Request错误
以下是几个可能导致错误的原因及对应的解决方法:
1. Calendar.Events.import 调用参数不符合API要求
你的代码直接将CSV字符串传入Calendar.Events.import,但该API方法需要将CSV作为带正确MIME类型的Blob对象传入,并且需要指定导入参数。修改代码如下:
function importSheetToCalendar() { var spreadsheetId = "YOUR_SPREADSHEET_ID"; var sheetName = "✨ CUSTOMIZE"; var calendarId = "YOUR_CALENDAR_ID"; var spreadsheet = SpreadsheetApp.openById(spreadsheetId); var sheet = spreadsheet.getSheetByName(sheetName); var data = sheet.getDataRange().getValues(); var csvData = convertToCSV(data); // 将CSV字符串转为Blob,设置正确的MIME类型 var csvBlob = Utilities.newBlob(csvData, "text/csv", "events.csv"); // 配置导入参数 var importParams = { sendNotifications: false, // 根据需求设置是否发送通知 supportsAttachments: false }; var events = Calendar.Events.import(csvBlob, calendarId, importParams); Logger.log(events); }
2. CSV格式未正确转义特殊字符
你的convertToCSV函数直接用逗号拼接字段,若字段包含逗号、换行符或双引号,会破坏CSV结构。修改为符合标准的CSV转义逻辑:
function convertToCSV(data) { var csvRows = []; for (var i = 0; i < data.length; i++) { var row = data[i].map(function(field) { // 若字段包含逗号、双引号或换行,用双引号包裹并转义内部的双引号 if (field.toString().match(/[,"\n]/)) { return '"' + field.toString().replace(/"/g, '""') + '"'; } return field; }); csvRows.push(row.join(",")); } return csvRows.join("\n"); }
3. 工作表表头与Google Calendar要求不匹配
确认Sheet的第一行表头严格匹配官方要求的字段名(大小写敏感),例如必须包含:
Subject(事件标题)Start Date(开始日期,格式如YYYY-MM-DD)Start Time(开始时间,格式如HH:MM,若为全天事件可省略)End Date(结束日期)End Time(结束时间,若为全天事件可省略)
额外字段如Description、Location需严格使用官方指定的名称,拼写或大小写错误会导致API解析失败。
4. 未启用Google Calendar高级服务
Calendar.Events.import属于Google Apps Script的高级服务,需在编辑器中手动启用:
- 打开Apps Script编辑器,点击菜单栏的「服务」→「添加服务」
- 找到「Calendar API」并添加,确保版本选择正确
5. 时区与时间格式问题
- 若事件包含时间,需确保CSV中包含
Time Zone字段(如Asia/Shanghai),或Calendar的默认时区与Sheet的时区一致 - 日期格式必须为
YYYY-MM-DD,时间格式为HH:MM(24小时制),避免使用其他格式(如MM/DD/YYYY)
内容的提问来源于stack exchange,提问作者EagleEye
相关产品推荐
相关产品推荐

