【问题标题】:ARRAYFORMULA with getNotes带有 getNotes 的 ARRAYFORMULA
【发布时间】:2021-04-07 11:26:03
【问题描述】:

是否可以使用 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)))

工作正常。

【问题讨论】:

  • 在你的脚本中,比如=getNotes("B2:B")放到一个单元格,结果会和你的目标一样吗?
  • 我的目标是让公式获取单元格的注释以填充其列中的相应单元格。例如,单元格 B2 中的注释应填充 P2 单元格、B10 到 P10 等。我只是认为,由于 ArrayFormula 的范围从 B1:B 开始,这就是要走的路。如果不是这样,我会很高兴看到正确的方法。
  • 根据回答者对未来后代的建议,在此处将第 2 部分添加到问题中:stackoverflow.com/questions/65524033/…

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


【解决方案1】:

根据您的评论更新答案:

如果您想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();
}

基本上,此脚本将找到最后一个有注释的单元格并返回到该单元格而不是整个范围:

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

解释:

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

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

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

=getNotes("B1:B")

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

如果你愿意,你可以使用内置的谷歌表格公式,比如transpose

替代方法:

您可以改用工作表对象的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):

这是一个有用的link,看看这个getRange 方法是如何工作的。

【讨论】:

  • 我已经尝试过使用你提到的转置,但我遇到了一些问题。 Here 是它目前的样子。当第一个单元格向我抛出错误时,下面的单元格都不会被填充。我想我可能忘记包含一个关键信息,那就是我想用公式的结果自动填充单元格,因为我任意创建新行,比如 ArrayFormula。
  • @user3245228 查看我更新的答案。您有 2 个选项,您可以转置特定范围(如我在回答中所示 - "B1:B10")或使用我的脚本找到最后一个带有注释的单元格。我现在给了你 2 个选择:)
  • 这个答案是朝着正确方向迈出的一大步,非常感谢。还有一个主要问题需要解决;与 ARRAYFORMULA 不同,当您通过任何标准以任意方式对列表进行排序时,注释不会跟随单元格,它们保留在最初填充的单元格中。有可能让他们这样做吗?作为一个快速的附带问题,我想使用IF(ROW(A:A)=1,"Label",getNotes("B1:B")) 用公式标记单元格,但这似乎不起作用。有没有办法给它贴上标签并防止它?此单元格与注释位于同一列(第一行)。
  • @user3245228 感谢您的反馈。不幸的是,stackoverflow 不允许跟进问题,而且答案已经很长了。您能否发布一个关于此修改的新问题,其他用户也将能够回答(包括我),许多其他读者将从这两个问题中受益。因此,请考虑通过单击答案左侧的勾选按钮来接受此问题,并发布有关后续修改的新问题。给您带来的不便,我们深表歉意。
  • 我已将您的答案标记为已接受,并在此处发布了一个新答案:stackoverflow.com/questions/65524033/… 谢谢您的帮助。
猜你喜欢
  • 2020-09-12
  • 2020-08-15
  • 2015-07-16
  • 2017-01-19
  • 1970-01-01
  • 2015-09-21
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多