在循环中使用 .getValue().这会导致许多调用.有没有更简单的方法可以做到这一点

Using .getValue() in a loop. This results in many calls. Is there a simpler way to do this?

本文关键字:更简单 有没有 调用 方法 这一点 许多 循环 getValue      更新时间:2023-09-26

对不起,如果这有点新手。

我正在尝试做的是获取一列并删除其某些单元格中的值(如果它们不包含公式)。

function clean() {
  var ss = SpreadsheetApp.openById("KEY_REMOVED_FOR_OBVIOUS_REASONS");
  var sheet = ss.getSheetByName("TEST");
  var limit = sheet.getMaxRows();

  for(var i = 6; i < limit; ++i){                                  // Declares variable "i", which represents the row we are currently checking. Basically says "if our row isn't the last one, execute this block then add to i".
    var range = sheet.getRange(i,2);
    if (range.getValue() != "") {                                  // Leverages the fact that .getValue() cannot return functions. If our range is blank, execute this block. 
      range.clear();
    }
  }
}

我建立了一个循环,逐一检查每一行。我想知道的是,有没有比每次循环时都必须调用服务器更有效的方法?

getValues() 当然存在,但我不确定如何仅与返回的所需单元格进行交互。

我做了一些测试。 如果有公式,.getValues()将返回计算值。

以下代码对我有用。

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getLastRow();
  var range = sheet.getRange(1,1, rows);
  var values = range.getFormulas();
  range.clear();
  range.setFormulas(values);
}

简答

关于调用过多问题,请使用getLastRow()而不是getMaxRows(),并使用返回值(行数)在一次调用中获取所需的范围。

解释

  • getLastRow() 返回包含内容的最后一行的位置,而getMaxRows()返回工作表的最大高度,而不考虑内容。

  • getRange(row, column, numRows)只需一次调用即可返回完整范围。