【问题标题】:Get last non-empty cell from range input从范围输入中获取最后一个非空单元格
【发布时间】:2021-05-22 16:40:59
【问题描述】:

到目前为止,我一直在使用 SF 的答案从一个范围中获取最后一个非空行:

=INDEX( FILTER( A4:D ; NOT( ISBLANK( A4:A ) ) ) ; ROWS( FILTER( A4:A ; NOT( ISBLANK( A4:A ) ) ) ) )

因为我开始经常使用它,所以我选择了一个脚本:

/* E.g. GETLASTNECELL(A4:A) */
function GETLASTNECELL(input) {
 
  if (!Array.isArray(input)) {
    throw new Error("Must be range")
  }
  if (input.map(col => col.length).sort()[0] !== 1) {
    throw new Error("Range must be a single column")
  }
  
  const col = input
    .map(row => row[0])   // get value
    .filter(val => typeof val !== 'undefined' && val.toString().length > 0) // empty
    return col[col.length - 1]
}

问题是这个功能真的很慢......它只是谷歌脚本生命周期的副产品吗?本机公式方法会立即显示结果。 (在 40x40 的小型电子表格上测试)

阅读:

【问题讨论】:

  • 用于澄清目的。你说你在40x40 电子表格上测试了这个公式。我测试了您的公式,并意识到它仅适用于单列。如果您看到错误消息,您有Error("Range must be a single column")。你如何执行它?你传递什么作为参数?
  • “真实”范围,例如GETLASTNECELL(A4:A)

标签: google-apps-script google-sheets


【解决方案1】:

是的,自定义函数/脚本比等效的内置函数慢。

大多数内置函数在客户端运行,而自定义函数/脚本在服务器端运行。

【讨论】:

  • 啊,谢谢,想了很多 :( 我希望有一种方法可以创建本地别名或类似的东西。
  • 您可以使用 Google Apps 脚本来插入您的公式,即创建一个自定义菜单。更进一步,您可能会使用对话框来询问范围引用或使用 R1C1 表示法:)
【解决方案2】:

尝试这种将范围作为string 传递的方法,让我知道它是否对您和我一样更快:

function GETLASTNECELL(input) {
  const sh = SpreadsheetApp.getActive().getActiveSheet();
  const lrow = sh.getLastRow();
  const Avals = sh.getRange(input+lrow).getValues();
  const value  = Avals[Avals.reverse().findIndex(c=>c[0]!='')]
  return value;
}

用法:

正则函数:

function myFunction() {
  const input = "A1:A";
  const sh = SpreadsheetApp.getActive().getActiveSheet();
  const lrow = sh.getLastRow();
  const Avals = sh.getRange(input+lrow).getValues();
  const value  = Avals[Avals.reverse().findIndex(c=>c[0]!='')]
  return value;
}

并从脚本编辑器执行它(单击运行按钮)或创建一个宏菜单以从电子表格本身执行它。

【讨论】:

  • 我缺乏理解是主要问题。我认为有一种方法可以在本地运行 gs 脚本,就像原生函数一样。
  • @nathan 你想把它作为一个常规函数运行吗?即,从脚本编辑器或某种宏菜单执行它?如果是,请告诉我,我会修改答案。
  • 该函数在电子表格中使用,我不需要手动运行它,因此可能不是这种情况。
  • @nathan 我的第一个代码运行得更快吗?如果没有,那很好,但我不确定你是否尝试过。
  • 我做了,因为我的电子表格不是很大,所以性能几乎相同(我没有进行基准测试,但问题在于服务器端通信)
猜你喜欢
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多