Google App Script: удаление пустых строк из диапазона выбора для сортировки - PullRequest
1 голос
/ 04 апреля 2020

Я хочу отсортировать в реальном времени, когда число вычисляется в столбце «Итого», который является суммой на основе других ячеек, введенных пользователем. Сортировка должна происходить по убыванию, и я достиг этой функциональности, используя следующее:

function onEdit(event){
  var sheet = event.source.getActiveSheet();
  var range = sheet.getDataRange();
  var columnToSortBy = 6;
  range.sort( { column : columnToSortBy, ascending: false } );

}

Это короткие и приятные, но пустые ячейки в итоговом столбце, которые содержат следующую формулу, закрывая себя, если результат суммы равен ноль, в противном случае выведите результат:

=IF(SUM(C2:E2)=0,"",SUM(C2:E2))

Это приводит к тому, что эти строки с невидимой формулой включаются в выбор диапазона, и при сортировке по убыванию они по какой-то причине оказываются наверху. Я хочу, чтобы эти пустые строки были либо отсортированы по низу, либо в идеальном сценарии удалены из самого диапазона (без удаления их и формулы, содержащейся в них) до сортировки.

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

РЕДАКТИРОВАТЬ: По запросу найдите ниже скриншот листа , Как показано на рисунке ниже, 6-й столбец общего количества баллов должен быть отсортирован по убыванию с победителем сверху. Это должно иметь предварительно вставленную формулу, идущую по длине, которая суммирует предыдущие столбцы для каждого участника.

Столбец, предшествующий ему (Баллы за уровни), автоматически рассчитывается путем умножения столбца «Уровни» на 10, чтобы получить окончательный результат. точки. Эта колонка может быть удалена, и все сместится, как только уйдет, но приятно поддерживать визуальное представление о фактических присужденных баллах. Пользовательский ввод вводится в 3 белых столбца.

Sheet sort

1 Ответ

1 голос
/ 04 апреля 2020
  • Вы хотите отсортировать лист по столбцу "F" в порядке убывания.
  • Вы хотите отсортировать лист, игнорируя пустые ячейки в столбце "F".
    • Вы хотите переместить пустые строки в конец строки.
  • Вы не хотите изменять формулы в столбце "F".
  • Вы хотите добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Проблема и обходное решение:

На текущем этапе, когда пустые ячейки разбросаны по столбцу «F», я думаю, что Встроенный метод «сортировки» класса Range нельзя использовать напрямую. Пустые ячейки перемещаются в верхнюю часть строки, как ваша проблема. Поэтому в этом ответе я хотел бы предложить использовать метод сортировки Javascript для этой ситуации.

Модифицированный скрипт:

Чтобы запустить эту функцию, отредактируйте ячейку.

function onEdit(event){
  const columnToSortBy = 6; // Column "F"
  const headerRow = 1; // 1st header is the header row.

  const sheet = event.source.getActiveSheet();
  const values = sheet.getRange(1 + headerRow, 1, sheet.getLastRow() - headerRow, sheet.getLastColumn())
    .getValues()
    .sort((a, b) => a[columnToSortBy - 1] > b[columnToSortBy - 1] ? -1 : 1)
    .reduce((o, e) => {
      o.a.push(e.splice(0, columnToSortBy - 1));
      e.splice(0, 1);
      if (e.length > 0) o.b.push(e);
      return o;
    }, {a: [], b: []});
  sheet.getRange(1 + headerRow, 1, values.a.length, values.a[0].length).setValues(values.a);
  if (values.b.length > 0) {
    sheet.getRange(1 + headerRow, columnToSortBy + 1, values.b.length, values.b[0].length).setValues(values.b);
  }
}
  • В этом примере сценария предполагается, что строка заголовка является первой строкой. Если в вашей ситуации строка заголовка не используется, измените ее на const headerRow = 0;.
  • Из вашего вопроса я не смог понять столбцы, кроме столбца "F". Таким образом, в этом примере сценария все столбцы в диапазоне данных, за исключением столбца «F», заменяются сортировкой. Пожалуйста, будьте осторожны.

Примечание:

  • Пожалуйста, используйте этот пример сценария с включением V8.

Ссылки:

Если я неправильно понял ваш вопрос, и вы не указали хочу, извиняюсь.

Добавлено:

  • Вы хотите отсортировать лист по столбцу "F" в порядке убывания.
  • Вы хотите отсортировать лист, игнорируя пустые ячейки в столбце «F».
    • Вы хотите переместить пустые строки в конец строки.
  • В вашей ситуации есть значения в столбцах с «A» по «F».
  • Формулы включены не только в столбец "F", но и в другие столбцы.
  • Вы не хотите изменять формулы.
  • Вы хотите достичь это с помощью Google Apps Script.

Из вашего ответа и обновленного вопроса я понял, как выше. Если мое понимание верно, как насчет этого примера сценария?

Пример сценария:

function onEdit(event){
  const columnToSortBy = 6; // Column "F"
  const headerRow = 1; // 1st header is the header row.

  const sheet = event.source.getActiveSheet();
  const range = sheet.getRange(1 + headerRow, 1, sheet.getLastRow() - headerRow, 6);
  const formulas = range.getFormulas();
  const values = range.getValues().sort((a, b) => a[columnToSortBy - 1] > b[columnToSortBy - 1] ? -1 : 1);
  range.setValues(values.map((r, i) => r.map((c, j) => formulas[i][j] || c)));
}
...