【问题标题】:Dynamically Autopopulate Column with getNotes使用 getNotes 动态自动填充列
【发布时间】:2020-12-31 17:40:20
【问题描述】:

这是来自the previous post 的后续问题。基本上我想在第一行使用getNotes 自动填充整个列,类似于ArrayFormula。之前的海报已经提供了这个功能:

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")

用 B 列中的相应注释填充列单元格。但问题是对列进行任何排序都不会动态更改这些注释的位置;该函数仍会记住先前排序的位置。此函数还需要在自动添加新行时动态地向单元格添加注释,并且基于它无法正确自动填充的方式,它也不会这样做。基本上,该函数只运行一次来​​填充,然后我必须再次手动运行该函数以使其重新填充到正确的位置。对此的帮助将不胜感激。

作为旁注,我还想用公式标记这个单元格。我试过了

IF(ROW(A:A)=1,"Label",getNotes("B1:B"))

查看它是否会类似于 ArrayFormula 并获取第一行作为标签,并将该函数用于列中的所有行,但它似乎不起作用。

【问题讨论】:

  • 为了帮助我们进行可视化,您能否提供一个示例表来显示您的数据和预期输出?
  • Here 是它的样例。但是,如果我按 ID 对它进行排序,例如...here,您可以看到“注释”列中的注释不再与其左侧的单元格相关(4B 右侧没有注释,尽管它包含笔记)。 This 是预期的输出。
  • 我添加了一张 sn-p 表 here,如果您想尝试一下以了解我的问题。非常感谢您的支持。

标签: google-apps-script google-sheets


【解决方案1】:

如果您想让注释适应数据移动的时间,您需要使用onEdit 触发器。

只要指定的范围(在我们的例子中是B1:B)被排序,下面的这个函数就会运行。

function onEdit(e){
  // Exit if edited range is not on column 2
  if (e.range.getColumn() != 2) return;

  const rng = "B1:B";
  const out = "C";
  const ss = SpreadsheetApp.getActive().getActiveSheet();
  const index = ss.getMaxRows()-ss.getRange(rng).getNotes().flat().reverse().findIndex(v=>v!='');
  const range = ss.getRange(rng+index);

  range.getNotes().forEach(function(note, i){
    ss.getRange(out+(i+1)).setValue(note[0]);
  });
}

这里有一点变化,你修改变量out 指向你想要写笔记的地方,在这种情况下,列C

排序前:

排序后(A):

排序后(逆B):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2010-10-28
    • 1970-01-01
    相关资源
    最近更新 更多