如何在Google Sheets Apps Script中移除旧分组并创建新分组
解决Google Sheets脚本中分组堆叠的问题
核心解决方案
在创建新的任务-里程碑分组前,先清除工作表中所有已有的行分组,避免新旧分组堆叠。
具体代码修改
在你的updateTaskMilestoneTest函数中,在执行创建分组的逻辑前,添加以下代码来清除所有旧分组:
// 清除Gantt Chart工作表中所有行分组 ganttSheet.clearRowGroups();
如果clearRowGroups()方法不适用(比如需要保留特定层级分组),也可以遍历所有现有分组并逐个移除:
// 遍历并移除所有行分组 const rowGroups = ganttSheet.getRowGroups(); rowGroups.forEach(group => { ganttSheet.removeRowGroup(group); });
集成到现有代码示例
把清除分组的代码放在获取工作表之后、处理任务数据之前:
function updateTaskMilestoneTest() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const ganttSheet = ss.getSheetByName("Gantt Chart"); const roleSheet = ss.getSheetByName("Roles"); // --- 新增:清除所有旧分组 --- ganttSheet.clearRowGroups(); // -------------------------- var lastCol = ganttSheet.getLastColumn(); var lastRow = ganttSheet.getLastRow(); var headerRow = ganttSheet.getRange('headerRow').getRow(); var firstTask = headerRow + 1; var taskNumCol = ganttSheet.getRange('taskNum').getColumn(); var taskCol = ganttSheet.getRange('taskNames').getColumn(); var roleCol = roleSheet.getRange('Roles').getColumn(); var taskRoleCol = ganttSheet.getRange('taskRole').getColumn(); var taskScanMarkerCell = ganttSheet.getRange(lastRow +1, taskCol); var lastTaskRow = taskScanMarkerCell.getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); var lastRoleRow = roleSheet.getRange('Roles').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); var rolesRange = roleSheet.getRange(1, roleCol, lastRoleRow, 1); var taskStartWeekCol = ganttSheet.getRange('startWeek').getColumn(); var taskStatusCol = ganttSheet.getRange('taskStatus').getColumn(); var taskExpDurationCol = ganttSheet.getRange('expDuration').getColumn(); var ganttWeeksRow = ganttSheet.getRange('ganttWeeks').getRow(); var ganttFirstWeekCol = ganttSheet.getRange('firstWeek').getColumn(); var defaultBGColor = "#ffffff"; var roleColors = rolesRange.getBackgrounds(); //identify selected row var selection = ss.getSelection(); var selectionRange = selection.getActiveRange(); var selectedTaskRow = selectionRange.getRow(); //reset background of the task row var taskRowRange = ganttSheet.getRange(selectedTaskRow, 1, 1, lastCol); taskRowRange.setBackground(defaultBGColor); Logger.log(selectedTaskRow); //run the program for the single row const updateTask = { "taskNumber" : ganttSheet.getRange(selectedTaskRow, taskNumCol).getValue(), "milestoneStatus" : Number.isInteger(ganttSheet.getRange(selectedTaskRow, taskNumCol).getValue()), //true or false "name" : ganttSheet.getRange(selectedTaskRow, taskCol).getValue(), "status" : ganttSheet.getRange(selectedTaskRow, taskStatusCol).getValue(), "taskRole" : ganttSheet.getRange(selectedTaskRow, taskRoleCol).getValue(), "assignee" : [], "dependency" : { "status" : [], "parent" : [], "type" : [], "buffer" : [] }, "startDate" : [], "endDate" : [], "duration" : [] } Logger.log(updateTask.milestoneStatus); var checkTaskCell = ganttSheet.getRange(selectedTaskRow, taskCol); var checkTaskCellValue = checkTaskCell.getValue(); var checkTaskRoleCell = ganttSheet.getRange(selectedTaskRow, taskRoleCol); var checkTaskRoleCellValue = checkTaskRoleCell.getValue(); var checkTaskStartWeekCell = ganttSheet.getRange(selectedTaskRow, taskStartWeekCol); var checkTaskStartWeekValue = checkTaskStartWeekCell.getValue(); var checkTaskExpDurationCell = ganttSheet.getRange(selectedTaskRow, taskExpDurationCol); var checkTaskExpDurationValue = checkTaskExpDurationCell.getValue(); var ganttTaskRange = ganttSheet.getRange(selectedTaskRow, ganttFirstWeekCol, 1, lastRow); // --- 此处执行你的分组创建逻辑 --- }
关键说明
clearRowGroups()会一次性移除工作表中所有行分组,完全适配你需要重置分组后重新创建的场景。- 若需精细控制(比如仅移除特定范围的分组),可通过
getRowGroups()获取分组对象,检查分组的起始/结束行后选择性移除。
内容的提问来源于stack exchange,提问作者Christian Butcher
相关产品推荐
相关产品推荐

