Google Sheets自动行分组脚本优化:去重/年层级/自动折叠等功能咨询
Google Sheets 行自动分组脚本优化需求
我此前在另一问题中求助,获得了可实现按日、月自动创建行分组的脚本,目前需要对该脚本进行优化,实现更多功能,替代原有仅能手动触发执行分组的逻辑。
具体优化需求
- 实现分组功能自动触发:我当前有一个每小时定时运行的脚本,会在表格底部新增数据行,我计划在该脚本末尾调用分组函数,但现有分组函数每次执行都会对所有行重新分组,导致分组重复、左侧分组栏冗余。希望优化后函数可自动识别未分组行,将其匹配加入对应已有日分组,或新建对应日期分组,不产生重复分组。
- 新增年层级分组:现有脚本仅支持日月分组,希望新增年分组层级,年分组下包含对应所有月分组,月分组下包含对应日分组。
- 自动插入年月标题行:希望在每个年分组、月分组的起始位置插入仅标注对应年份、月份的空白行,作为分组的首行,折叠分组时仅显示该标题行。
- 自动折叠分组:首次执行函数后自动折叠所有历史分组,当日分组保持展开,当日24点结束后自动折叠当日分组,新建次日分组并保持其展开状态。
我目前处于代码学习阶段,基础有限,希望可以获得优化后的完整代码,或者相关实现思路、带逐行注释的代码方便我理解学习。
现有分组函数代码
function groupRow() { const timeZone = "GMT+1"; const sheet = SpreadsheetApp.getActiveSheet(); const rowStart = 5; const rows = sheet.getLastRow() - rowStart + 1; const values = sheet.getRange(rowStart, 1, rows, 1).getValues().flat(); const o = []; values.forEach((date, i) => { const [m, d] = Utilities.formatDate(date, timeZone, "yyyyMM,dd").split(","); if (!o[m]) { o[m] = []; } if (!o[m][d]) { o[m][d] = []; } o[m][d].push(rowStart + i); }); var collator = new Intl.Collator([], {numeric: true}); for (var m in o) { o[m] = Object.values(o[m]).sort((a,b) => parseInt(a) - parseInt(b)); } Object.values(o).forEach(m => { for (const d of m) { if (d.length === 1) { continue; } const range = `${ d[1] }:${ d.slice(-1)[0] }`; sheet.getRange(range).shiftRowGroupDepth(1); } const a = m.flat(); if (a.length === 1) { return; } const range = `${ a[1] }:${ a.slice(-1)[0] }`; sheet.getRange(range).shiftRowGroupDepth(1); }); }
补充:我已在本问题下回复了最终实现方案。
内容的提问来源于stack exchange,提问作者Verminous
相关产品推荐
相关产品推荐

