多小数任务编号生成与后续编号批量更新的最优方案问询
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
相关产品推荐
相关产品推荐

