首页 > 解决方案 > 仅将非空白行从一个选项卡复制到另一个选项卡

问题描述

我有一个 Google 表格脚本,可以将一系列单元格从一个选项卡复制到另一个选项卡。问题是我希望它只复制非空白单元格范围,而是复制包括空白行在内的整个范围。已经讨论了这个问题的许多版本,但我似乎找不到正确的解决方案,所以我再次询问以下所有细节。

我正在复制的范围包括:

  1. 如果 B 列非空白,则 A 列包含具有文本输出的公式。如果 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函数实际上并没有过滤掉空白行。那么我该怎么做呢?

调试信息:

标签: google-apps-scriptgoogle-sheets

解决方案


我相信我已经找到了一个适合我的用例的解决方案。如果你想分享你的想法,我相信有办法改进它。我在这里找到了一个计算非空白行的脚本,并将其与脚本其余部分的一些调整一起集成:

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

推荐阅读