Google Sheet 脚本 - 删除范围内的空白单元格间隙以保持列表紧凑整洁?

问题描述 投票:0回答:1

我需要有关谷歌应用程序脚本的帮助。我想更新下面的脚本。我需要删除脚本的当前逻辑,当清除一行时,当 B28:X500 范围内存在空白单元格间隙时,该脚本会将行向上移动。

它的问题是:脚本想要移动 B28:X500 范围内带有空白单元格的所有行(甚至是我不关心的工作表底部的行)+我进行了运行时间故障排除,基本上这不是我想要的。

我想要的是:在脚本根据“任务主列表”工作表上的条件清除行后,它会将已清除的行下方的单元格范围上移(来自 B:X 列。此功能将基于当在工作表 B28:X500 的范围内清除范围时,在 E 列上将单元格向上移动。

目标是消除任何空白并保持列表紧凑整洁......

我将分享一张图片来更好地说明我想要的:

您会看到这是一个任务列表,E 列中是任务...当此脚本运行时,它将创建空白单元格以显示在工作表中,因为已完成的任务存档在另一张工作表上。我希望脚本保持几乎相同,但要缩小列表中出现的间隙,但仅限于从 B 列到 X 列的单元格。您在图片中的任务之间看到的间隙类型是我想摆脱什么。

因此,它将剩余的任务向上移动(女巫在 E 列中)并保持任务列表紧凑整洁。理想情况下,我希望脚本只搜索任务之间的间隙,而不是查看所有工作表,以便更快地采取行动..如果它可以在 E 列中查找文本作为规则来向上移动单元格范围,例如。另外,请记住,如果在 E 列中找到一系列空白单元格,我不想向上移动整个行,而只是向上移动 B28:X500 之间的单元格范围,以避免后续行中出现间隙。这个要怎么写呢?

这是我目前正在编写的脚本:

* @OnlyCurrentDoc
 */
function archiveTasks() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var taskSheet = ss.getSheetByName("Task Masterlist");
  var archiveSheet = ss.getSheetByName("Archive");
  
  // Define the range to check
  var range = taskSheet.getRange("B28:X500");
  var values = range.getValues();
  
  // Loop through the rows in reverse order
  for (var i = values.length - 1; i >= 0; i--) {
    if (values[i][0] === true) { // Check if the first column (B) is "True"
      // Get the row to move
      var row = values[i];
      
      // Find the first empty row in the Archive sheet starting from row 18
      var emptyRow = findFirstEmptyRow(archiveSheet, 18);
      
      // Move the row to the Archive sheet
      archiveSheet.getRange("B" + emptyRow + ":X" + emptyRow).setValues([row]);
      
      // Add the current date and time to column Y in the Archive sheet
      var timeZone = "America/Toronto"; // Set your time zone
      var date = new Date();
      var formattedDate = Utilities.formatDate(date, timeZone, "yyyy-MM-dd HH:mm:ss");
      archiveSheet.getRange("Y" + emptyRow).setValue(formattedDate);
      
      // Clear the specific range in the Task Masterlist sheet but retain formulas
      var formulas = taskSheet.getRange(28 + i, 2, 1, 23).getFormulas()[0];
      taskSheet.getRange(28 + i, 2, 1, 23).clearContent();
      taskSheet.getRange(28 + i, 2, 1, 23).setFormulas([formulas]);
      
      // Move the rows below up to remove gaps
      shiftRowsUp(taskSheet, 28 + i, 500);
    }
  }
  
  // Sort the remaining tasks by the due date (column F)
  taskSheet.getRange("B28:X500").sort({column: 6, ascending: true});
  
  // Ensure the sheet always has 500 rows with the same format and formulas
  maintainRowCount(taskSheet, 500);
}

function findFirstEmptyRow(sheet, startRow) {
  var data = sheet.getRange("B" + startRow + ":B").getValues();
  for (var i = 0; i < data.length; i++) {
    if (!data[i][0]) {
      return startRow + i;
    }
  }
  return startRow + data.length;
}

function shiftRowsUp(sheet, startRow, endRow) {
  for (var i = startRow; i < endRow; i++) {
    var currentRange = sheet.getRange(i, 2, 1, 23);
    var nextRange = sheet.getRange(i + 1, 2, 1, 23);
    var nextValues = nextRange.getValues();
    var nextFormulas = nextRange.getFormulas();
    
    currentRange.setValues(nextValues);
    currentRange.setFormulas(nextFormulas);
  }
  
  // Clear the last row in the range
  sheet.getRange(endRow, 2, 1, 23).clearContent();
}

function maintainRowCount(sheet, targetRowCount) {
  var lastRow = sheet.getLastRow();
  var numRowsToAdd = targetRowCount - lastRow;
  if (numRowsToAdd > 0) {
    var sourceRange = sheet.getRange(400, 2, 1, 23); // Copying from row 400
    for (var j = 0; j < numRowsToAdd; j++) {
      var targetRange = sheet.getRange(lastRow + 1 + j, 2, 1, 23);
      sourceRange.copyTo(targetRange);
    }
  }
}
 

我尝试以各种方式编写此脚本,但尚未找到我想要实现的目标的正确表述。

google-sheets google-apps-script error-handling
1个回答
0
投票

我认为实现目标的最简单方法不需要代码:使用内置的排序范围功能。

  1. 在 Google 表格网络应用中打开电子表格。
  2. 选择要排序的范围
  3. 单击 数据 > 排序范围,然后选择最适合您需求的选项。

Data > 排序范围菜单

其他选项

  • 右键单击所选范围的任意单元格,然后查看更多单元格操作 > 对范围进行排序
  • 单击 Google 表格工具栏上的“过滤器”按钮,然后单击列标题上的下拉按钮。按列排序选项也可在过滤视图按视图分组中使用。
© www.soinside.com 2019 - 2024. All rights reserved.