带有 getNotes 的 ARRAYFORMULA

时间:2020-12-31 01:56:40

标签: javascript google-apps-script google-sheets

是否可以使用 Arrayformula 填充公式“getNotes”上的整列? https://developers.google.com/apps-script/reference/spreadsheet/range#getNotes()

到目前为止,我已经在 Apps Script 中添加了如下小功能:

function getNotes(cell)
{
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var range = ss.getRange(cell)
   return range.getNotes();   
}

然后按如下方式填充列的第一个单元格:

=ARRAYFORMULA(IFERROR(getNotes(Address(row(B1:B), column(B1:B)))))

这似乎不起作用。为了记录,

=getNotes(Address(row(B2:B), column(B2:B)))

工作正常。

1 个答案:

答案 0 :(得分:2)

根据您的评论更新答案:

如果您想 transpose 完整范围的列并传递完整列 B "B1:B",您可以改用它:

function getNotes(rng){
  const ss = SpreadsheetApp.getActive().getActiveSheet();
  const index = ss.getMaxRows()-ss.getRange(rng).getNotes().flat().reverse().findIndex(v=>v!='');
  const range = ss.getRange(rng+index);
  return range.getNotes();
}

本质上,这个脚本会找到最后一个有注释的单元格并返回到那个单元格而不是整个范围:

updated answer

您也可以使用 getNotes("B1:B"),它的工作方式相同,但它会将值分布在一列而不是一行中。

说明:

正如 Tanaike 在他的评论中提到的,您当前的代码:

function getNotes(cell)
{
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var range = ss.getRange(cell)
   return range.getNotes();   
}

需要将所需范围作为字符串传递:

=getNotes("B1:B")

enter image description here

您不需要 arrayformula,因为此自定义函数本身返回一个数组。

如果需要,您可以使用内置的 google 表格公式,例如 transpose

example

替代方法:

您可以改用工作表对象的 getRange(row, column, numRows, numColumns) 方法,它允许您根据需要传递数字:

function getNotes(rs,cs,re,ce)
{
   var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
   var range = ss.getRange(rs,cs,re,ce);
   return range.getNotes();
}

然后这样称呼它=getNotes(1,2,3,1)

example2

这是查看此 getRange 方法如何工作的有用 link