将 Google 应用脚本中的 #N/A 或 #REF 单元格替换为空白,改进查询执行

Replace #N/A or #REF cells with blank in Google App Script, improve query execution

我正在尝试用空白值替换 google sheet 中的 #N/A 或 #REF 单元格。 我不能使用 IFERROR,因为我们正在使用错误值来条件格式化可能包含错误值的单元格。

采取的步骤:

  1. 将原始范围sheet导入新范围
  2. 使用 Google 应用程序脚本将导入范围 sheet 复制到另一个
  3. 遍历新的 sheet 以用空白替换 #N/A 或 #REF 单元格

问题:执行仅需 5 分钟多一点的时间即可完成。 (实际 60 行 30 列 google sheet)。我怎样才能加快执行速度?

Sample Sheet

function isError_(cell) {
  const errorValues = ["#N/A", "#REF"];
  for (var i = 0; i < errorValues.length; ++i)
    if (cell == errorValues[i])
      return true;
  return false;
}

function Sample() 
{
  var sheetName = "Sample"; // Please set the tab name you want to overwrite the data.
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var final_table = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Final Sample");

  // ### PASTE VALUE TO ANOTHER SHEET
  sheet.getRange("A2:AP"+sheet.getLastRow()).copyTo(final_table.getRange(1,1), SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);

  var Avals = final_table.getRange("D2:D").getValues();
  var Alast = Avals.filter(String).length;

  var range = final_table.getDataRange();
  var vals = range.getValues();

  for (var row = 1; row <= Alast; ++row) 
  {
    for(var col = 0; col <= final_table.getLastColumn(); ++col)
    { 
      if (isError_(vals[row][col])) 
      {
        var data = "";
        SpreadsheetApp.getActive().getSheets()[1].getRange(row+1,col+1).setValue(data)
      }
    } 
  }

}

我认为在您的脚本中,SpreadsheetApp.getActive().getSheets()[1].getRange(row+1,col+1).setValue(data) 用于循环。我认为这可能是您遇到问题的主要原因。这样的话,工艺成本会很高。

为了降低脚本的处理成本,下面的修改怎么样?

修改后的脚本:

function Sample() {
  var sheetName = "Sample";
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  var final_table = ss.getSheetByName("Final Sample");
  sheet.getRange("A2:AP" + sheet.getLastRow()).copyTo(final_table.getRange(1, 1), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  final_table.createTextFinder("#N\/A|#REF").useRegularExpression(true).matchEntireCell(true).replaceAllWith("");
}
  • 在此示例中,"#N/A", "#REF" 使用 TextFinder 替换为 ""

参考文献: