【问题标题】:How to count the Quantity of formulae in a Google Sheets Document?如何计算 Google 表格文档中的公式数量?
【发布时间】:2020-03-31 07:27:23
【问题描述】:

有没有办法计算复杂的 Google 表格文档(多标签)中的公式数量

我已经使用 ARRAYFORMULA 等函数重新设计了一个旧模板,我真的很想确定复杂性的降低 - 公式的数量是一个代理。最初有成千上万的逐行、逐列复制/粘贴计算。

【问题讨论】:

  • 关于count the number of formulae,您要检索Google电子表格中所有工作表上包含公式的单元格数?
  • 您应该计算“加载时间”作为性能标准,而不是公式的数量。
  • @TheMaster 你是对的。旧工作表上的性能很差,加载速度很慢。有什么一致的方法可以实现这一目标吗?我还注意到在看 TaskManager 时,带有所有版本包袱的旧工作表会占用大量内存,当您获取新副本并且可能会丢掉很多包袱时,它可能会大大减少 = 性能更高、加载速度更快等。跨度>
  • @Aitch 我想不出一种编程方式来做到这一点。您可以使用onOpen() 记录脚本最终启动所需的时间(通常脚本在所有公式加载后启动)。但是您必须自己记录实际的开放时间。加载时间 = 脚本时间 - 手动记录的时间。想到的另一种可能性是SpreadsheetApp.flush()。使用console.time()“可能”进行此调用所花费的时间反映了性能(因为它将公式同步到服务器),但我不确定这一点。

标签: google-apps-script google-sheets


【解决方案1】:

我相信您想检索包含 Google 电子表格中所有工作表上的公式的单元格数量。如果我的理解是正确的,我想建议使用 Google Apps Script。那么这个示例脚本怎么样?

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

模式一:

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

示例脚本:

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

模式 2:

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

示例脚本:

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

注意:

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

参考资料:

【讨论】:

  • 模式 2 是一个非常优雅的解决方案,它适用于我的“新”工作表,但不适用于“旧”工作表,我正在尝试确定原因并将报告。
  • @Aitch 感谢您的回复。不幸的是,虽然我无法复制它,但我认为您问题的各种模式的答案将对很多用户有用。谢谢你的好问题。
  • 认为这与受保护或隐藏的工作表有关。我还没有深究。
  • @Aitch 感谢您的回复。看起来图案2不受保护和隐藏片的影响。不幸的是,我仍然无法复制您的情况。对此我深表歉意。
【解决方案2】:

答案:

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

代码:

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;  
}

【讨论】:

    【解决方案3】:

    使用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
      );
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      相关资源
      最近更新 更多