使用 getNotes

时间:2020-12-31 17:40:20

标签: google-apps-script google-sheets

这是来自 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 一样工作并获取第一行作为标签,并对该列中的所有行使用该函数,但它似乎不起作用。

1 个答案:

答案 0 :(得分:2)

如果您想让音符适应数据移动的时间,您需要使用 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

排序前:

enter image description here

排序后(A):

after B

排序后(反向B):

after B