如何计算Google表格文档中的公式数量?

时间:2020-03-31 07:27:23

标签: google-apps-script google-sheets

有没有一种方法可以计算复杂的Google表格文档(多选项卡式)中的公式数量

我已经使用诸如ARRAYFORMULA之类的函数对旧模板进行了重新设计,我真的很想确定复杂度的降低-公式的数量是对此的一种代理。最初有成千上万的逐行,逐列复制/粘贴计算。

3 个答案:

答案 0 :(得分:2)

我可以理解,您想检索单元格数,包括Google Spreadsheet中所有工作表上的公式。如果我的理解正确,我想建议使用Google Apps脚本。那么这个示例脚本怎么样?

我认为,提出各种方法时,它们可能对用户有用。因此,我想提出以下两个示例脚本。

模式1:

在此模式下,将从活动电子表格中检索所有工作表,并从每个工作表中检索包含公式的单元格数。为了计算元素数,将二维数组展平。

示例脚本:

function myFunction() {
  const res = SpreadsheetApp
    .getActiveSpreadsheet()
    .getSheets()
    .reduce((n, s) => n += s.getDataRange().getFormulas().flat().filter(String).length, 0);
  console.log(res)
}

模式2:

在此模式下,使用TextFinder检索公式。在这种情况下,无需使用循环过程即可从活动电子表格中的所有工作表中检索所有公式。搜索的详细过程在Google端的内部服务器上运行。在我的环境中,发现该模式的处理成本低于模式1的处理成本。在相同条件下,模式2的成本约为模式1的成本的1/5。

示例脚本:

function myFunction() {
  const res = SpreadsheetApp
    .getActiveSpreadsheet()
    .createTextFinder("^\\=")
    .matchFormulaText(true)
    .useRegularExpression(true)
    .findAll().length;
  console.log(res)
}

注意:

  • 两种模式都返回相同的结果。
  • 请在启用V8的情况下运行脚本。

参考文献:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。

答案 1 :(得分:1)

答案:

您可以获取所有表格中所有单元格中的所有公式,如果该单元格以=字符开头,则可以将其添加到计数器中。

代码:

function getAllFormulae() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var count = 0;
  
  for (var i = 0; i < ss.length; i++) {
    var currSheetValues = ss[i].getDataRange().getFormulas();
    for (var j = 0; j < currSheetValues.length; j++) {
      for (var k = 0; k < currSheetValues[j].length; k++) {
        if (currSheetValues[j][k].startsWith("=") == 1) {
          count++
        }
      }
    }
  }  
  return count;  
}

希望对您有帮助!

答案 2 :(得分:1)

使用getFormulas获取所有公式并计算所有不为空的元素:

const getTotalFormulasCount = () =>
  console.log(getNumFormulas_(SpreadsheetApp.getActive().getSheets()));

/**
 * @param {GoogleAppsScript.Spreadsheet.Sheet[]|string[][]|string[]} arr Array of sheets or 1D or 2D array of formulas
 * @returns {number} count of formulas present in arr
 */
const getNumFormulas_ = arr =>
  arr.reduce(
    (count, el) =>
      count +
      (Array.isArray(el) //if el is array, recurse
        ? getNumFormulas_(el)
        : el.getRange //if el is sheet, recurse over it's formulas
        ? getNumFormulas_(el.getDataRange().getFormulas())
        : Number(el !== '')),
    0
  );