仅将非空白行从一个选项卡复制到另一选项卡

时间:2018-10-02 15:00:19

标签: google-apps-script google-sheets

我有一个Google表格脚本,可以将一系列单元格从一个标签复制到另一个标签。问题是我希望它仅复制单元格的非空白范围,而是复制整个范围,包括空白行。已经讨论了这个问题的许多版本,但是我似乎找不到正确的解决方案,因此我再次要求下面提供所有详细信息。

我要复制的范围包括:

  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 :(得分:0)

我相信我已经找到了适合我的用例的合适解决方案。如果您想分享自己的想法,我敢肯定,有一些方法可以改善它。我找到了一个脚本来计算非空白行here,并将其与对脚本其余部分的一些调整集成在一起:

// 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);
}