首页 > 解决方案 > 谷歌表格 - 优化在一定范围内创建笔记的功能(非常慢)

问题描述

我有一个脚本可以根据单元格的值在单元格上创建注释,但是这个过程非常缓慢,而且我的工作表有 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); }
 } 
}

表格示例:https ://docs.google.com/spreadsheets/d/1lu7dEoyO2NDHV4phXeh8DAAkbBuQG5EQWwMA6SJDP1A/edit?usp=sharing

标签: javascriptgoogle-apps-scriptoptimizationgoogle-sheets

解决方案


解释:

两个技巧:

  • 尽可能避免不必要的 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);
}

推荐阅读