Google Sheet Script – удаление пробелов в пустых ячейках внутри диапазона, чтобы список был компактным и аккуратным?

Мне нужна помощь со скриптом приложения Google. Я хочу обновить скрипт ниже. Мне нужно удалить текущую логику скрипта, который сдвигает строки вверх при наличии пробелов в пустых ячейках в диапазоне B28:X500, когда строка очищается.

Проблема в том, что скрипт хочет переместить ВСЕ строки с пустыми ячейками в диапазоне B28:X500 (даже те, которые находятся в нижней части листа, которые меня не волнуют) + у меня есть устранение неполадок во время выполнения, и в основном это это не то, что я хочу.

Я хочу: после того, как сценарий очистил строку на основе условий на листе «Основной список задач», он смещает диапазон ячеек ниже очищенной строки (из столбца B: X. Эта функция будет основана на столбец E, чтобы сдвинуть ячейки вверх, когда диапазон очищается в пределах этого диапазона листа B28:X500.

Цель состоит в том, чтобы устранить любые пробелы и сохранить список компактным и аккуратным...

Я поделюсь картинкой, чтобы лучше проиллюстрировать то, что я хочу:

Вы видите, что это список задач, в столбце E указаны задачи... при запуске этого сценария он создает пустые ячейки, которые появляются на листе, поскольку выполненные задачи архивируются на другом листе. Я хочу, чтобы скрипт остался почти таким же, как есть, но закрыл пробелы, которые появляются внутри списка, но только для ячеек от столбца B до X. Типы пробелов, которые вы видите между задачами на картинке, это от чего я хочу избавиться. Google Sheet Script – удаление пробелов в пустых ячейках внутри диапазона, чтобы список был компактным и аккуратным?

Как следствие, оставшаяся задача будет перемещена вверх (они находятся в столбце 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);
    }
  }
}
 

Я пытался написать этот сценарий разными способами, но не нашел правильной формулировки того, чего я пытаюсь достичь.

Во-первых, я должен извиниться за мое плохое знание английского языка. Насчет 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.

Tanaike 19.08.2024 01:10

Кстати, насчет in column E is the tasks, первый столбец вашего изображения — столбец «B»? Чтобы правильно понять ваш вопрос, можете ли вы предоставить примеры ожидаемых ситуаций ввода и вывода? Во-первых, мне хотелось бы правильно понять Ваш вопрос.

Tanaike 19.08.2024 01:10

Возможно, вы слишком много об этом думаете. Вы можете попробовать использовать встроенную функцию диапазона сортировки.

Wicket 19.08.2024 01:36

Калитка Спасибо большое! Да, очевидно, я слишком много думал об этом. Я ничего не знал о функции сортировки диапазона до вашего комментария 13 часов назад. Я учусь по ходу дела! Вы просто указываете мне правильное направление. Я действительно ценю. Это работает так, как я задумал.

Lucie 19.08.2024 15:11

Танаике, спасибо, что пришли и предложили помощь!

Lucie 19.08.2024 15:13

@Wicket, это было отличное предложение. Можете ли вы опубликовать это как ответ на этот вопрос?

Babanana 19.08.2024 15:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что самый простой способ достичь вашей цели не требует кода: используйте встроенную функцию диапазона сортировки.

  1. Откройте электронную таблицу в веб-приложении Google Sheets.
  2. Выберите диапазон для сортировки
  3. Нажмите «Данные» > «Диапазон сортировки», затем выберите вариант, который лучше всего соответствует вашим потребностям.

Другие варианты

  • Щелкните правой кнопкой мыши любую ячейку выбранного диапазона, затем выберите «Просмотреть дополнительные действия ячеек» > «Сортировать диапазон».
  • Нажмите кнопку «Фильтр» на панели инструментов Google Таблиц, затем нажмите кнопку раскрывающегося списка в заголовке столбца. Опция сортировки по столбцу также доступна в представлениях «Фильтр» и «Группировка по представлению».

Соответствующая справочная статья

Из Справочного центра редакторов 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), потому что это проще. Это отлично работает для меня!

Надеюсь, это полезно!

Другие вопросы по теме