javascript - 谷歌表格 - 优化在一定范围内创建笔记的功能(非常慢)
问题描述
我有一个脚本可以根据单元格的值在单元格上创建注释,但是这个过程非常缓慢,而且我的工作表有 15000 行。是否可以通过优化脚本来减少延迟?
PS:我使用带有法语参数的电子表格。
function InsertCellsNotes(){
var plage = SpreadsheetApp.getActiveSpreadsheet().getSelection().getActiveRange();
var Notes = plage.getValues();
var NB_lines = Notes.length;
for (var i=1; i<NB_lines+1; i++){ // ajouter +1 !
var myCell = plage.getCell(i, 1);
var cellValue = Notes[i-1];
if (cellValue == "#N/A" || ""){ }
else { myCell.setNote(cellValue); }
}
}
解决方案
解释:
两个技巧:
尽可能避免不必要的 api 调用。您正在迭代地使用与电子表格文件交互的方法,这会导致极大的延迟。阅读最佳实践。
当您
null
用作 的参数时setNote
,不会设置注释。我们可以利用这一点,使用map方法构造一个数组。即,如果值为#N/A
或空白""
,则分配null
给元素,否则取单元格的值:var notes = rng.getValues().flat().map(v=>[v=="#N/A" || ""?null:v]);
这将允许您摆脱for
循环,但还可以创建一个可以直接在setNotes函数中使用的数组:rng.setNotes(notes);
解决方案 - 有效范围:
选择(用鼠标)特定范围并插入注释(取决于条件):
function InsertCellsNotes(){
var rng = SpreadsheetApp.getActiveRange();
var notes = rng.getValues().flat().map(v=>[v=="#N/A" || ""?null:v]);
rng.setNotes(notes);
}
解决方案 - 预定义范围:
这是一种更静态的方法。您定义一个特定的工作表"Sheet1"
,并为列中的所有单元格B
(直到包含工作表内容的最后一行)插入注释(取决于条件):
function InsertCellsNotes(){
var plage = SpreadsheetApp.getActive().getSheetByName("Sheet1");
var rng = plage.getRange(1,2,plage.getLastRow(),1);
var notes = rng.getValues().flat().map(v=>[v=="#N/A" || ""?null:v]);
rng.setNotes(notes);
}
推荐阅读
- javascript - 使用 cytoscape.js 对节点背景颜色进行离散颜色映射
- python - Django TinyMCE 图片上传器
- redis - Redis 需要加锁吗?
- python - 如何将行从一个数据帧附加到另一个具有不同列结构的数据帧
- sockets - GRPC Python - 处理套接字错误的正确方法是什么?
- sap - SAP HANA 审计日志
- android - 浓缩咖啡 typeText() 与 editText.setKeyListener(DigitsKeyListener.getInstance(null, false, true));
- c++ - 如何使用向量名称作为变量?
- java - JUnit 不适用于 Lombok - 注释处理似乎不适用于测试类
- angular - 在角度 8 中显示隐藏 div onClick 动态添加的单选按钮