如何编写脚本从含任务截止日期的Sheet创建Google Calendar事件并设置提前提醒
如何用Google Apps Script从Sheet创建带提前提醒的日历事件
嘿,这个需求我之前帮不少人实现过,其实用Google Apps Script就能轻松搞定,全程不用跳出Google生态。我给你拆解成一步步的操作,跟着来就行:
第一步:先整理好你的Sheet结构
假设你的Sheet是两列布局:
- A列:任务名称(比如「完成项目周报」)
- B列:截止日期(得是Google Sheets能识别的格式,比如
2024-10-08,先把B列单元格格式设为「日期」类型,避免脚本识别出错)
小提示:如果你的第一行是表头(比如A1写「任务」,B1写「截止日期」),脚本会自动跳过表头行,不用额外处理。
第二步:打开Google Apps Script编辑器
打开你的Sheet,点击顶部菜单的「扩展程序」→「Apps Script」,会弹出一个新的脚本编辑页面,默认的Code.gs文件就是我们写代码的地方。
第三步:编写核心脚本
把下面的代码替换掉默认的内容,我会给你标注关键可修改的地方:
function createCalendarEventsWithReminders() { // 获取当前Sheet的数据 const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const data = sheet.getDataRange().getValues(); // 跳过表头行(如果没有表头,就把.slice(1)删掉) const tasks = data.slice(1); // 👇 这里设置提前提醒的天数,改成你需要的数字就行 const reminderDaysBefore = 3; // 获取你的主日历,要指定其他日历的话,换成getCalendarById("你的日历ID") const calendar = CalendarApp.getDefaultCalendar(); // 遍历每一行任务数据 tasks.forEach((task, index) => { const taskName = task[0]; // A列的任务名称 const deadline = task[1]; // B列的截止日期 // 跳过空行或者无效日期 if (!taskName || !(deadline instanceof Date)) return; // 计算提醒时间:截止日期往前推设置的天数 const reminderTime = new Date(deadline); reminderTime.setDate(reminderTime.getDate() - reminderDaysBefore); try { // 创建日历事件 const event = calendar.createEvent( taskName, deadline, // 事件开始时间(设为截止日当天,变成全天事件) deadline, // 事件结束时间(和开始时间一致) { description: `任务截止日期:${deadline.toLocaleDateString()}`, reminders: { overrides: [ // 提前X天发邮件提醒,分钟数=天数×24×60 {method: 'email', minutes: reminderDaysBefore * 24 * 60}, // 提前X天在日历里弹出提醒,不需要可以删掉这一行 {method: 'popup', minutes: reminderDaysBefore * 24 * 60} ] } } ); // 可选:在C列标记事件状态,避免重复创建 sheet.getRange(index + 2, 3).setValue(`已创建:${event.getId()}`); console.log(`成功创建事件:${taskName}`); } catch (error) { console.error(`创建事件失败 ${taskName}:`, error); sheet.getRange(index + 2, 3).setValue(`创建失败:${error.message}`); } }); }
关键参数说明
reminderDaysBefore:直接改数字就能调整提前提醒的天数,比如改成7就是提前一周提醒- 事件时间:如果你的截止日期有具体时间(比如当天17:00),可以把
deadline改成new Date(deadline.setHours(17,0,0)),这样事件就会是指定时间的非全天事件 - 提醒方式:
reminders.overrides里的email和popup可以二选一,或者都保留,根据你的习惯来 - 日历选择:如果不用主日历,去目标日历的「设置和共享」里找到「日历ID」,替换掉
getDefaultCalendar()的部分就行
第四步:测试脚本
先在Sheet里填1-2行测试数据(比如A2写「测试任务」,B2填明天的日期),然后回到脚本编辑器点击「运行」按钮。第一次运行会触发授权,Google会提示“此应用未经验证”,别慌,点击「高级」→「继续访问」(因为这是你自己写的脚本,安全得很)。
运行完后,打开你的Google Calendar看看有没有对应的事件,同时检查Sheet的C列有没有标记状态,没问题的话就可以批量处理数据了。
第五步:设置定时自动运行(可选)
如果你希望脚本定期检查Sheet里的新任务并自动创建事件,可以设置触发器:
- 点击脚本编辑器左侧的「触发器」图标(闹钟样的)
- 点击「添加触发器」,配置如下:
- 选择运行的函数:
createCalendarEventsWithReminders - 事件来源:「时间驱动」
- 时间类型:比如「每天」「每周」,根据你的更新频率选
- 设置具体运行时间,比如每天早上9点
- 选择运行的函数:
- 保存后,脚本就会自动定期执行,不用手动跑啦
一些小提醒
- 确保Sheet的日期格式正确,无效日期会被脚本跳过
- 已经标记为「已创建」的行,再次运行脚本时不会重复创建事件,放心跑
- 如果调整了Sheet的列顺序,记得修改代码里
task[0]和task[1]对应的列索引(比如任务改到B列就改成task[1])
内容的提问来源于stack exchange,提问作者user12742603
相关产品推荐
相关产品推荐

