Мне нужна помощь со скриптом приложения Google. Я хочу обновить скрипт ниже. Мне нужно удалить текущую логику скрипта, который сдвигает строки вверх при наличии пробелов в пустых ячейках в диапазоне B28:X500, когда строка очищается.
Проблема в том, что скрипт хочет переместить ВСЕ строки с пустыми ячейками в диапазоне B28:X500 (даже те, которые находятся в нижней части листа, которые меня не волнуют) + у меня есть устранение неполадок во время выполнения, и в основном это это не то, что я хочу.
Я хочу: после того, как сценарий очистил строку на основе условий на листе «Основной список задач», он смещает диапазон ячеек ниже очищенной строки (из столбца B: X. Эта функция будет основана на столбец E, чтобы сдвинуть ячейки вверх, когда диапазон очищается в пределах этого диапазона листа B28:X500.
Цель состоит в том, чтобы устранить любые пробелы и сохранить список компактным и аккуратным...
Я поделюсь картинкой, чтобы лучше проиллюстрировать то, что я хочу:
Вы видите, что это список задач, в столбце E указаны задачи... при запуске этого сценария он создает пустые ячейки, которые появляются на листе, поскольку выполненные задачи архивируются на другом листе. Я хочу, чтобы скрипт остался почти таким же, как есть, но закрыл пробелы, которые появляются внутри списка, но только для ячеек от столбца B до X. Типы пробелов, которые вы видите между задачами на картинке, это от чего я хочу избавиться.
Как следствие, оставшаяся задача будет перемещена вверх (они находятся в столбце E) и сохранится компактный и аккуратный список задач. В идеале мне бы хотелось, чтобы скрипт искал только промежутки между задачами, а не просматривал весь лист, для более быстрого действия... если бы он мог искать текст в столбце E, как правило, чтобы переместить диапазон ячеек вверх, например . Также помните, что я не хочу сдвигать всю строку вверх, а хочу сдвигать только диапазон ячеек между B28:X500, если в столбце E обнаружен ряд пустых ячеек, чтобы избежать пробелов в следующих строках. Как мне это написать?
Вот сценарий, над которым я сейчас работаю:
* @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);
}
}
}
Я пытался написать этот сценарий разными способами, но не нашел правильной формулировки того, чего я пытаюсь достичь.
Кстати, насчет in column E is the tasks
, первый столбец вашего изображения — столбец «B»? Чтобы правильно понять ваш вопрос, можете ли вы предоставить примеры ожидаемых ситуаций ввода и вывода? Во-первых, мне хотелось бы правильно понять Ваш вопрос.
Возможно, вы слишком много об этом думаете. Вы можете попробовать использовать встроенную функцию диапазона сортировки.
Калитка Спасибо большое! Да, очевидно, я слишком много думал об этом. Я ничего не знал о функции сортировки диапазона до вашего комментария 13 часов назад. Я учусь по ходу дела! Вы просто указываете мне правильное направление. Я действительно ценю. Это работает так, как я задумал.
Танаике, спасибо, что пришли и предложили помощь!
@Wicket, это было отличное предложение. Можете ли вы опубликовать это как ответ на этот вопрос?
Я думаю, что самый простой способ достичь вашей цели не требует кода: используйте встроенную функцию диапазона сортировки.
Другие варианты
Из Справочного центра редакторов Google Документов.
Для меня было важно, чтобы пробелы удалялись автоматически во время работы скрипта. Я поясняю, что сам сценарий будет создавать эти пробелы, в то время как выполненные задачи будут перемещаться в архив. Лист, поэтому мне нужна была функция, «которая исправляла бы» пробелы, созданные в этом процессе, и я хотел, чтобы она запускалась сама по себе.
Итак, вот как я исправил это для своего сценария... Эта строка кода была добавлена в скрипт, и она делает следующее:
После перемещения выполненных задач на лист «Архив» оставшиеся задачи в диапазоне B28:X500 сортируются по сроку выполнения (в столбце F) в порядке возрастания. Это помогает автоматически устранять любые пробелы, сдвигая соответствующий диапазон вверх, и сохранять список задач компактным и аккуратным.
Вот код:
// Sort the remaining tasks by the due date (column F)
taskSheet.getRange("B28:X500").sort({column: 6, ascending: true});
Я использовал столбец даты (F) вместо столбца задач (E), потому что это проще. Это отлично работает для меня!
Надеюсь, это полезно!
Во-первых, я должен извиниться за мое плохое знание английского языка. Насчет
when a row is cleared.
, могу ли я спросить вас о деталяхwhen a row is cleared
? И что касаетсяshifts rows up when there are gaps of blank cells within the range B28:X500,
, когда я увидел ваш сценарий показа вarchiveSheet.getRange("Y" + emptyRow).setValue(formattedDate);
, мне показалось, что вы хотите поместить значение в столбец «Y». Я не могу понять связь между этой ситуацией иshifts rows up
.