修改Google Apps Script日历函数实现周事件展示及优化
解决Google Apps Script周日历仪表板的两个核心问题
你已经迈出了把月度日历改成周视图的关键一步,现在咱们来搞定剩下的两个问题,让你的周计划仪表板完美运行。
1. 让EEEE格式显示母语(比如荷兰语)
Utilities.formatDate其实支持指定本地化参数,你只需要在格式字符串后面加上对应的语言区域代码就行。比如如果你的母语是荷兰语,就用"EEEE dd/MM", "nl_NL",这样星期几就会显示成荷兰语的Maandag、Dinsdag这类,而不是英文的Monday、Tuesday。
修改后的日期格式化代码示例:
Utilities.formatDate(events2[i].getStartTime(), Session.getScriptTimeZone(), "EEEE dd/MM", "nl_NL")
注意:语言区域代码要对应你需要的母语,比如德语是
"de_DE",法语是"fr_FR",根据自己的需求调整。
2. 补全无事件日期,实现完整类日历视图
现在你的函数会跳过没有事件的日期,咱们需要先生成当前周(周一到周日)的所有日期列表,然后把日历事件按日期分组,最后遍历这个日期列表,有事件就展示,没有就显示空状态。
步骤分解:
- 生成周一到周日的日期数组
- 将获取到的事件按日期分组(用日期字符串作为键)
- 遍历日期数组,逐个匹配对应日期的事件,没有就显示空内容
完整的修改后代码
下面是整合了两个解决方案的完整函数,你可以直接替换原来的email函数:
function getWeeklyCalendarEvents() { const CalendarID = "你的日历ID"; // 替换成你的日历ID const date = new Date(); const dayOfWeek = date.getDay(); // 0=周日, 1=周一...6=周六 // 计算本周一的日期(处理周日的特殊情况) const monday = new Date(date.getFullYear(), date.getMonth(), date.getDate() - dayOfWeek + (dayOfWeek === 0 ? -6 : 1)); // 计算本周日的日期 const sunday = new Date(monday); sunday.setDate(monday.getDate() + 6); // 获取本周所有事件(加一天确保包含周日全天的事件) const events = CalendarApp.getCalendarById(CalendarID).getEvents(monday, new Date(sunday.getTime() + 24 * 60 * 60 * 1000)); // 生成本周所有日期的数组(周一到周日) const weekDates = []; for (let i = 0; i < 7; i++) { const currentDate = new Date(monday); currentDate.setDate(monday.getDate() + i); // 生成用于匹配的日期字符串(格式:yyyy-MM-dd) const dateKey = Utilities.formatDate(currentDate, Session.getScriptTimeZone(), "yyyy-MM-dd"); // 存储日期对象和显示用的日期文本(母语格式) weekDates.push({ date: currentDate, dateKey: dateKey, displayDate: Utilities.formatDate(currentDate, Session.getScriptTimeZone(), "EEEE dd/MM", "nl_NL") // 替换为你的母语区域代码 }); } // 将事件按日期分组 const eventsByDate = {}; events.forEach(event => { const eventDateKey = Utilities.formatDate(event.getStartTime(), Session.getScriptTimeZone(), "yyyy-MM-dd"); if (!eventsByDate[eventDateKey]) { eventsByDate[eventDateKey] = []; } eventsByDate[eventDateKey].push({ time: Utilities.formatDate(event.getStartTime(), Session.getScriptTimeZone(), "HH:mm"), title: event.getTitle() }); }); // 构建最终的周视图数据 const weeklyData = []; weeklyData.push("<b>本周计划</b>"); // 表头 weekDates.forEach(day => { // 添加日期标题 weeklyData.push(`<h4>${day.displayDate}</h4>`); // 获取当天的事件,没有的话显示提示 const dayEvents = eventsByDate[day.dateKey] || []; if (dayEvents.length > 0) { dayEvents.forEach(event => { weeklyData.push(`${event.time}<br/>${event.title}`); }); } else { weeklyData.push("<i>无事件</i>"); // 空日期的提示文本 } weeklyData.push("<hr/>"); // 日期分隔线,优化视图排版 }); return weeklyData; }
代码说明:
- 周日期范围计算:修正了周日的边界处理,确保能获取到周日全天的所有事件
- 本地化日期:通过指定区域代码
"nl_NL"让星期几显示为母语,你可以根据自己的语言替换这个参数 - 补全无事件日期:先生成一周的所有日期,再逐个匹配事件,没有事件的日期会显示
<i>无事件</i>,完美实现类日历的完整视图
这样修改后,你的周计划仪表板就能显示完整的周一到周日的每一天,不管有没有事件,而且日期格式也会是你熟悉的母语啦。
内容的提问来源于stack exchange,提问作者Nina Bakker
相关产品推荐
相关产品推荐

