google-apps-script - Google表格:查找范围内的最后一行 - 自定义公式
问题描述
我一直在寻找谷歌表格的自定义函数,它可以找到最后一行有数据。
我希望能够给出一个范围并找到包含数据的最后一行,以及能够指定它将作为输出提供的列。
例如,在 A:A 范围内搜索其最后一行的条目,并从 C:D 返回同一行。在这种情况下,它将导致 [["cool","beans"]] 作为输出。
+---+--------+------+-------+------+
| | A | B | C | D |
+---+--------+------+-------+------+
| 1 | Words | | Then | |
+---+--------+------+-------+------+
| 2 | and | asd | a | |
+---+--------+------+-------+------+
| 3 | things | | thing | Yep |
+---+--------+------+-------+------+
| 4 | | here | | Why? |
+---+--------+------+-------+------+
| 5 | stuff | | cool | beans|
+---+--------+------+-------+------+
| 6 | | | | |
+---+--------+------+-------+------+
我找到了一些解决方案,但有些只允许检查单个列,没有很好地处理空白或需要使用引号,这意味着公式拖放功能丢失了。或者使用很长的函数组合,例如 this。
我决定制作自己的自定义公式,您可以在下面查看我的解决方案。
解决方案
我使用谷歌应用脚本创建了一个自定义函数。(在 Google 表格中:工具 --> 脚本编辑器)
如果我在某些情况下没有遵守约定,我向那里的专业人士道歉!我自学创造了这个。
它将检查给定范围并输出最后一行中的所有值,或者,如果指定,则输出给定范围的另一个范围/子集中的最终对应行。
示例用法: LASTROW(A:A,B:D) 将检查范围 A:A 的最终非空行,并返回 B:D 的相应行。
只要行数相等,这将起作用,例如。拉斯特罗(A1:A10,B21:B30)
/**
* Returns the last row in a range, can be single or multi-column.
*
*
* @param {A1:A100} range_to_check Range to find final row
* and returns contents if no range_to_return is specified.
* @param {[B1:E100]} range_to_return [optional] Range for row to be returned.
* i.e if row 3 in range_to_check is final row, then row 3 in range_to_return will be returned.
* @customfunction
*/
function LASTROW(range_to_check,range_to_return) {
// checks range_to_check for final row with non-empty entries
// range_to_return is optional, will return final row of range_to_check if missing
if (Array.isArray(range_to_check)) {
// checks if input is a range/cell reference
// N.B: Google Apps Script parses a cell range as an array of values
for (i=0;i<range_to_check.length;i++) {
// For each row i, check if any columns are non-empty
var final_column_in_row = undefined;
for (j=0;j<range_to_check[i].length;j++) {
if (range_to_check[i][j] !== '') {
final_column_in_row = j;
}
}
if (final_column_in_row != undefined) { // if any columns in row i are non-empty
var final_row = i; // set row i as final column
}
}
if (final_row != undefined) {
// if there exists a non-empty row
if (range_to_return == undefined) {
// and no range_to_return is specified
return [range_to_check[final_row]];
// return the final row of range_to_check
} else {
// if range_to_return is specified
if (range_to_check.length == range_to_return.length) {
// and both ranges have the same number of rows
return [range_to_return[final_row]];
// return the corresponding row from range_to_return
// i.e if final row of range_to_check is 5, returns the 5th row of range_to_return
} else {
throw 'Ranges have different number of rows, or range_to_check is not an array.'
}
}
} else {
return null;
}
} else {
throw 'range_to_check is not a range.';
}
}
希望有人在那里找到一些用处:)
推荐阅读
- ios - 当我点击带有动画的搜索栏时,iOS隐藏导航栏
- c# - 出列列表项并在位置 0 插入新项
- razor - 当我使用 br 标记时,换行符在 cshtml 视图页面中不起作用
- c# - 将默认 azurewebsites 重写为自定义域
- reactjs - 如何在不从选项中选择的情况下在 react-select 中捕获用户的输入
- python - 如何将对象类型转换为最近邻函数的整数类型?
- intellij-idea - IntelliJ IDEA 中未删除不推荐使用的方法
- python - Python 3:检测 ajax 查询
- sql - 如何从 Postgresql 子查询中的同一个表中获取用户名而不是 id?
- mysql - MySQL 性能?