我需要有关谷歌应用程序脚本的帮助。我想更新下面的脚本。我需要删除脚本的当前逻辑,当清除一行时,当 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);
}
}
}
我尝试以各种方式编写此脚本,但尚未找到我想要实现的目标的正确表述。