google-apps-script - 仅将非空白行从一个选项卡复制到另一个选项卡
问题描述
我有一个 Google 表格脚本,可以将一系列单元格从一个选项卡复制到另一个选项卡。问题是我希望它只复制非空白单元格范围,而是复制包括空白行在内的整个范围。已经讨论了这个问题的许多版本,但我似乎找不到正确的解决方案,所以我再次询问以下所有细节。
我正在复制的范围包括:
- 如果 B 列非空白,则 A 列包含具有文本输出的公式。如果 B 列为空白,则 A 列中的公式会创建一个空白条目 (
""
)。 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
函数实际上并没有过滤掉空白行。那么我该怎么做呢?
解决方案
我相信我已经找到了一个适合我的用例的解决方案。如果你想分享你的想法,我相信有办法改进它。我在这里找到了一个计算非空白行的脚本,并将其与脚本其余部分的一些调整一起集成:
// 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);
}
推荐阅读
- java - 如何制作最好的 DTO 请求类?
- javascript - 平均计算器发现奇怪和不正确的数字
- javascript - 如何将样式化组件样式应用于自定义 React 组件?
- python - 如何将一些数据输入网站并从 html 表中获取输出?
- android - 如何并行获取 observables,其中只有一个 api 调用具有重试逻辑
- r - 在 rmarkdown 子文件中嵌入 svg 数字
- android - 无法检查用户是否附加了图像
- python - 是否有一个功能可以提取标签内的标签和美丽汤中的所有其他标签
- swift - 如何实现firebase事务
- html - 如何在不影响其他浏览器的情况下最好地修复 Safari 透视 (TranslateZ) 堆叠上下文?