google-apps-script - 使用 getNotes 动态自动填充列
问题描述
这是上一篇文章的后续问题。基本上我想在第一行使用类似于ArrayFormula 的 getNotes 自动填充整个列。之前的海报已经提供了这个功能:
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 并获取第一行作为标签,并对列中的所有行使用该函数,但它似乎不起作用。
解决方案
如果您想让笔记适应数据移动的时间,您需要使用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
以指向您希望写入注释的位置,在本例中为 column C
。
排序前:
排序后(A):
排序后(反向B):
推荐阅读
- apache-spark - 如何在 IDE 中将 spark 连接到 neo4j
- spring - Spring在循环上创建bean
- xcode - 构建 mac 应用程序会在 .app 中生成 .app
- python - 如何在 python 中使用 selenium 定期重新检查网页
- airflow - Airflow:如何使用宏获取上个月的第一天?
- javascript - 如何使 log.csv 文件在一行中记录 400 个 .jpeg 名称(Photoshop/JavaScript)
- c# - csharpcodeprovider:不能使用 Process.Start()
- javascript - Android 上的 Vue.js keyup 事件和 v-model 长度无法按预期工作
- scala - 错误单元不带参数scala
- https - 现有 https 证书添加通配符