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

如何修改脚本实现Google Calendar多日事件增改及修复结束日期问题

Google Apps Script 日历事件同步问题

背景

现有由Tainake协助开发的Google Apps Script,已实现以下功能:

  • 根据出勤状态设置Google Calendar中全天事件的颜色
  • 通过表单提交数据添加或更新单日全天事件(若已有事件描述变更则自动更新)

需扩展的功能:

  • 允许管理人员通过表单为员工安排/修改多日假期事件,无需重复提交表单
  • 因表格用于统计,禁止手动修改日历

两种实现方案

方案1

修改脚本支持多日事件的添加与更新,同时保留原单日事件更新功能(特定人员的单日事件描述变更时自动更新),表格D列预留用于填写结束日期。

方案2

修改脚本仅处理E列值为"Yes"的行。已通过公式生成包含日期区间的单独表格,但当前脚本遍历空行导致运行超时。

当前脚本

function updateCal() {
  var cal = CalendarApp.getCalendarById("CalendarID");
  var data = SpreadsheetApp.getActive().getSheetByName("Entries");
  const [, ...rows] = data.getDataRange().getValues();
  rows.forEach(([eventtitle, eventdescription, eventdate, , color]) => {
    console.log(eventdate + eventtitle + eventdescription)
    const eventdate1 = new Date(eventdate)
    const events = cal.getEventsForDay(eventdate1);
    if (events.length == 0 || (events.length > 0 && !events.some(e => e.getTitle() == eventtitle) && !events.some(e => e.getDescription() == eventdescription))) {
      cal.createAllDayEvent(eventtitle, eventdate1, { description: eventdescription }).setColor(CalendarApp.EventColor[color]);
    } else {
      events.forEach(e => {
        if (e.getTitle() == eventtitle && e.getDescription() != eventdescription) {
          e.setDescription(eventdescription).setColor(CalendarApp.EventColor[color]);
        }
      });
    }
  });
}

经@GiselleValladares 修改后的脚本

function updateCal() {
  var cal = CalendarApp.getCalendarById("CalendarID");
  var data = SpreadsheetApp.getActive().getSheetByName("Entries");
  const [, ...rows] = data.getDataRange().getValues();
  rows.forEach(([eventtitle, eventdescription, eventdate, , color]) => {
    console.log(eventdate + eventtitle + eventdescription)
    const eventdate1 = new Date(eventdate);

    // 新增结束日期变量
    // 让用户在表单中填写事件结束的准确日期
    // 新增以下变量确保事件添加正确
    const millisPerDay = 1000 * 60 * 60 * 24 * 2; 
    const eventEndDate = new Date(eventEnddate.getTime() + millisPerDay);

    const events = cal.getEventsForDay(eventdate1);
    if (events.length == 0 || (events.length > 0 && !events.some(e => e.getTitle() == eventtitle) && !events.some(e => e.getDescription() == eventdescription))) {

      // 添加结束日期参数
      cal.createAllDayEvent(eventtitle, eventdate1, eventEndDate,{ description: eventdescription }).setColor(CalendarApp.EventColor.color);
    } else {
      events.forEach(e => {
        if (e.getTitle() == eventtitle && e.getDescription() != eventdescription) {
          e.setDescription(eventdescription).setColor(CalendarApp.EventColor.color);
        }
      });
    }
  });
}

存在的问题

修改后单日事件显示正常,但多日事件结束日期提前1天(例如Don Drysdale的事件应显示5月9日至5月12日,实际显示提前结束)。

内容的提问来源于stack exchange,提问作者Codedabbler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:53:09