Google Apps Script日期数组合并与星期名称提取异常问题
问题:无法正确获取完整星期名称数组并统计频次
我是编程新手,尤其不熟悉JavaScript和Google Apps Script(GAS)。我正在编写脚本以找出日历中事件最多的日期,但遇到了无法正确访问数组属性的问题。我的代码片段如下:
let startDate = events[i].getStartTime(); let daysRange = getDatesBetween(startDate, realEndDate).toLocaleString('default', { weekday: 'long' }); const daysArr = daysRange[0]; Logger.log(daysArr);
我希望daysArr返回完整的星期名称,但它仅返回首字母。请帮忙解释原因。
附:自定义函数getDatesBetween的实现如下:
function getDatesBetween(startDate, realEndDate) { let dates = []; //var to store dates between startDate and end Date let intDate = new Date(startDate); //initializing intDate with startDate without mutating dates.push(intDate); //loop while intDate < realEndDate continue the loop (adding days to the array) while (realEndDate - intDate > 0) { dates.push(new Date(intDate)); intDate.setDate(intDate.getDate() + 1); } return dates; }
startDate和realEndDate分别来自events[i].getStartTime()和events[i].getEndTime()。
我希望将其整理为如下格式的星期名称数组:
daysRange = ["Monday", "Tuesday", "Friday", "Wednesday", "Monday", "Tuesday"];
以便统计出现频次最高的星期。我尝试过flat()、join()、split()、map()等方法,但因daysRange[0]返回的是首字母而非完整单词,这些方法都无法生效。
问题原因与解决方案
1. 首字母问题的根源
你直接对日期数组调用toLocaleString(),数组的该方法会把所有日期元素转为字符串后用逗号拼接成一个长字符串(比如"Monday,Tuesday,Wednesday")。此时daysRange[0]取的是这个字符串的第一个字符,自然只会返回首字母。
2. 生成正确的星期名称数组
需要遍历日期数组,对每个日期单独调用toLocaleString()获取完整星期名称,用map()方法最直接:
let startDate = events[i].getStartTime(); let dateArray = getDatesBetween(startDate, realEndDate); // 遍历每个日期,转换为完整星期名称 const daysArr = dateArray.map(date => { return date.toLocaleString('default', { weekday: 'long' }); }); Logger.log(daysArr); // 输出格式:["Monday", "Tuesday", ...]
3. 统计频次最高的星期
拿到正确数组后,用对象统计频次,再找出最大值对应的星期:
// 统计每个星期的出现次数 const frequency = {}; daysArr.forEach(day => { frequency[day] = (frequency[day] || 0) + 1; }); // 找出频次最高的星期 let maxCount = 0; let mostFrequentDay = ""; for (const day in frequency) { if (frequency[day] > maxCount) { maxCount = frequency[day]; mostFrequentDay = day; } } Logger.log(`出现次数最多的星期:${mostFrequentDay},共${maxCount}次`);
4. 修复getDatesBetween的重复日期问题
原函数会重复添加起始日期,调整循环逻辑避免重复:
function getDatesBetween(startDate, realEndDate) { let dates = []; let intDate = new Date(startDate); while (intDate <= realEndDate) { dates.push(new Date(intDate)); intDate.setDate(intDate.getDate() + 1); } return dates; }
内容的提问来源于stack exchange,提问作者Spanner
相关产品推荐
相关产品推荐

