我有一个Google表格脚本,可以将一系列单元格从一个标签复制到另一个标签。问题是我希望它仅复制单元格的非空白范围,而是复制整个范围,包括空白行。已经讨论了这个问题的许多版本,但是我似乎找不到正确的解决方案,因此我再次要求下面提供所有详细信息。
我要复制的范围包括:
""
)。 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
函数实际上并未过滤出空白行。那我该怎么办呢?
答案 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);
}