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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:39:05