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

多小数任务编号生成与后续编号批量更新的最优方案问询

Markdown格式规范说明
  • 标题:使用数字符号#,层级对应#数量(如#一级标题、##二级标题)
  • 列表项:以短横线-开头
  • 文本强调:用星号*包裹(如*强调文本*)
  • 代码/命令:用反引号`包裹(如`console.log()`)
  • 引用文本:使用大于号>开头
  • 链接:格式为[链接文本](URL地址)
  • 图片:格式为[图片替代文本](图片URL地址)

多级任务编号调整实现方案

采用多小数格式编号标记任务步骤与子步骤(如1、1.1、1.2、1.2.1),任务通过类Excel的JS框架在浏览器展示,支持用户通过快捷键或对话框调整选中步骤的层级(如1.1上移一级变为2),且允许子步骤跳过前置子步骤存在(如1后直接跟1.1.1)。以下是当前实现的代码:

任务编号下移一级触发函数

for (var i = activeSheet.getActiveRowIndex(); i < (activeSheet.getActiveRowIndex() + 1); i++) {
    var taskNumberCellValue = activeSheet.getCell(i, 0).value();
    var taskLevel = (taskNumberCellValue.match(/\./g) || []).length + 1;
    var targetLevel = taskLevel + 1;
    activeSheet.getCell(i, 0).value(this.generateWorkingElementNumber(i, targetLevel, activeSheet));
}
this.updateWorkElementNumbering(activeSheet, namedRange, activeSheet.getActiveRowIndex());

任务编号上移一级触发函数

for (var i = activeSheet.getActiveRowIndex(); i < (activeSheet.getActiveRowIndex() + 1); i++) {
    var taskNumberCellValue = activeSheet.getCell(i, 0).value();
    var taskLevel = (taskNumberCellValue.match(/\./g) || []).length + 1;

    var targetLevel = taskLevel - 1;
    activeSheet.getCell(i, 0).value(this.generateWorkingElementNumber(i, targetLevel, activeSheet));
}

// TODO: PUT THE FOLLOWING FUNCTION CALL INTO A LOOP TO ACCOUNT FOR multiple selected rows
this.updateWorkElementNumbering(activeSheet, namedRange, activeSheet.getActiveRowIndex());

生成选中行新任务编号函数

generateWorkingElementNumber: function (rowNumber, targetLevel, activeSheet) {
    var previousTaskNumberCellValue = activeSheet.getCell(rowNumber - 1, 0).value();
    var previousTaskLevel = (previousTaskNumberCellValue.match(/\./g) || []).length + 1;
    var splitPreviousTaskNumberCellValue = previousTaskNumberCellValue.split(".");

    var selectedTaskNumber = activeSheet.getCell(rowNumber, 0).value();
    var selectedTaskNumberLevel = (selectedTaskNumber.match(/\./g) || []).length + 1;
    var splitSelectedTaskNumber = selectedTaskNumber.split(".");

    var taskNumToReturn = splitPreviousTaskNumberCellValue[0];
    
    if (targetLevel > previousTaskLevel) {
        for (var i = 2; i <= previousTaskLevel; i++) {
            taskNumToReturn = taskNumToReturn + "." + splitPreviousTaskNumberCellValue[i - 1];
        }

        for (var i = (previousTaskLevel + 1); i <= targetLevel; i++) {
            taskNumToReturn = taskNumToReturn + "." + "1";
        }
    }
    else {
        if (targetLevel == 1) {
            taskNumToReturn = (parseInt(splitPreviousTaskNumberCellValue[0]) + 1).toString();
            return taskNumToReturn;
        }
        else {
            taskNumToReturn = splitPreviousTaskNumberCellValue[0];
        }

        for (var i = 2; i < (targetLevel); i++) {
            taskNumToReturn = taskNumToReturn + "." + splitPreviousTaskNumberCellValue[i - 1];
        }
        taskNumToReturn = taskNumToReturn + "." + (parseInt(splitPreviousTaskNumberCellValue[targetLevel - 1]) + 1).toString();
    }
    return taskNumToReturn
}

批量更新后续任务编号函数

updateTaskNumbering: function (activeSheet, namedRange, rowNumber) {
    var previousTaskNumberCellValue = activeSheet.getCell((rowNumber - 1), 0).value();
    var previousTaskLevel = (previousTaskNumberCellValue .match(/\./g) || []).length + 1;
    var splitPreviousTaskNumberCellValue = previousTaskNumberCellValue.split(".");

    var taskNumToReturn = splitPreviousTaskNumberCellValue[0];
    for (var i = rowNumber; i < (namedRange.Lf.endRow + 1); i++) {
        var selectedTaskNumber = activeSheet.getCell(i, 0).value();
        var selectedTaskNumberLevel = (selectedTaskNumber.match(/\./g) || []).length + 1;
        var targetLevel = selectedTaskNumberLevel;

        if (targetLevel > previousTaskLevel) {
            taskNumToReturn = splitPreviousTaskNumberCellValue[0];
            for (var j = 2; j <= previousTaskLevel; j++) {
                taskNumToReturn = taskNumToReturn + "." + splitPreviousTaskNumberCellValue[j-1];
            }

            for (var k = (previousTaskLevel+ 1); k <= targetLevel; k++) {
                splitPreviousTaskNumberCellValue[k-1] = 1;
                taskNumToReturn = taskNumToReturn + "." + "1";
            }
        }
        else {
            if (targetLevel == 1) {
                splitPreviousTaskNumberCellValue[0] = (parseInt(splitPreviousTaskNumberCellValue[0]) + 1).toString();
                taskNumToReturn = splitPreviousTaskNumberCellValue[0];
            }
            else {
                taskNumToReturn = splitPreviousTaskNumberCellValue[0];
                for (var l = 2; l <= (targetLevel - 1); l++) {
                    taskNumToReturn = taskNumToReturn + "." + splitPreviousTaskNumberCellValue[l];
                }
                splitPreviousTaskNumberCellValue[targetLevel - 1] = (parseInt(splitPreviousTaskNumberCellValue[targetLevel - 1]) + 1).toString();
                taskNumToReturn = taskNumToReturn + "." + splitPreviousTaskNumberCellValue[targetLevel - 1];
            }
        }
        activeSheet.getCell(i, 0).value(taskNumToReturn);
        previousTaskLevel = targetLevel;
    }
},

目前上述功能运行良好,后续发现Bug会反馈或更新代码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:25:24