Копировать только непустые строки с одной вкладки на другую - PullRequest
0 голосов
/ 02 октября 2018

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

Диапазон, который я копирую, состоит из:

  1. Столбец A содержит формулу с выводом текста, если столбец B не пустой.Если столбец B пустой, формула в столбце A создает пустую запись ("").
  2. Столбцы B: J - это =IMPORTRANGE из другого листа с диапазоном, установленным на A5:H (открытый диапазон).

Вот текущий скрипт:

// custom menu function
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('Copy Data');
  var item = menu.addItem('Copy Data','copyData');
  item.addToUi();
}

function copyData() { 
// START1: get current sheet and tabs
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var current = ss.getSheetByName('ImportRange'); 
  var database = ss.getSheetByName('RunningList');

// count rows to snap
  var current_rows = current.getLastRow();
  var database_rows = database.getLastRow() + 1;
  var database_rows_new = current_rows + database_rows - 3;
  var rows_new = current.getRange('A3:J' + current_rows).getValues();
  var nonblank_values = rows_new.filter(String);

// snap rows, can run this on a trigger to be timed
  database.getRange(database_rows, 1, nonblank_values.length, nonblank_values[0].length).setValues(nonblank_values);
}

СпасибоВы потратили время на изучение этой проблемы.

РЕДАКТИРОВАТЬ 1

Когда я отлаживаю скрипт, похоже, что функция filter фактически не отфильтровывает пустые строки.Так как бы я на самом деле это сделал?

Информация об отладке:

1 Ответ

0 голосов
/ 04 октября 2018

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

// add custom menu function "Copy Data"
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('Copy Data');
  var item = menu.addItem('Copy Data','copyData');
  item.addToUi();

}

// function to identify last populated row of any tab (based on column A)
function getLastPopulatedRow(sheet) {
  var data = sheet.getDataRange().getValues();
  for (var i = data.length-1; i > 0; i--) {
    for (var j = 0; j < data[0].length; j++) {
      if (data[i][j]) return i+1;
    }
  }
  return 0;
}

// function to copy data from one tab to another
function copyData() { 

// step 1: get current sheet and tabs
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var current = ss.getSheetByName('ImportRange'); 
  var database = ss.getSheetByName('RunningList');

// step 2: count number of new rows needed and grab non-blank rows from first tab
  var current_lastrow = getLastPopulatedRow(current);
  var database_rows = getLastPopulatedRow(database) + 1;
  var database_rows_new = current_lastrow + database_rows - 3;
  var rows_new = current.getRange('A3:I' + current_lastrow).getValues();

// step 3: add values to second tab
  database.getRange("A" + database_rows + ":I" + database_rows_new).setValues(rows_new);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...