【问题标题】:Google Script with Spreadsheet - Function to Count Column Values带有电子表格的 Google 脚本 - 计算列值的函数
【发布时间】:2013-04-10 15:05:43
【问题描述】:

我正在构建一个 Google 电子表格,我将在其中将一堆数据输入到该电子表格中,然后在另一个工作表上,我想从中提取统计数据。我很难正确计算这些值。

我想要完成的事情 - 构建一个函数,我可以添加到任何单元格中,通过根据函数中的目标/参数计算重复值来获取特定列的统计信息。

例子:

表 1 在 E 列中包含我需要计算的数据(包含 1 或 2 个字母以指示状态。 表 2 是我将提取所有统计数据的地方。 我添加了一个这样的函数:=getData("A")

函数本身已经指向 sheet1 和 E 列。函数在这里说的是,“我希望你提取 E 列中的所有数据并告诉我有多少单元格被标记为 A”,然后给出我是伯爵。

我有大约 5 个不同的值,我会在这里独立搜索。我们会说 A、B、C、D 和 E。所以如果我去搜索 C,我会使用:=getData("C")

将统计信息拉到统计表上的另一个单元格中

到目前为止我所得到的(不起作用) - 我对这些东西的编码很粗略,所以我还在学习很多东西。到目前为止,这是我正在尝试的:

function getData(target) {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SHEET1");
  var lrow = ss.getLastRow();
  var r = ss.getRange(2, 5, lrow, 1);
  var data = r.getValues();
  var count;

  for (var i = 0; i < lrow ; i++) {
    var count = 1;
    for (var j = 0; j < i; i++) {
      if (data[j][0].value(target) == data[i][0].value(target)) {
        count++;
      }
    }
  return (count);
  }
}

我也试过: if (data.value() == target) { count++; }

但这似乎也没有帮助。我究竟做错了什么?要么我没有正确计算和/或没有提取数据来正确计算它。我已经搜索了很多帖子,但似乎无法汇总我需要的内容。

感谢任何人提供的任何帮助。谢谢。


已解决的代码(感谢@ScampMichael) - 这种细微的变化实际上允许我使用 =getData("Example1","Example2") 格式搜索多个值并计算总数:

function getData(target1, target2) {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SHEET1");
  var lrow = ss.getLastRow();
  var r = ss.getRange(2, 5, lrow-1, 1); // lrow-1 to not count header
  var data = r.getValues();
  var count = 0; // 0 must be declared here or you'll get error: Overflow on the spreadsheet

  for (var i=0; i<data.length; i++) {
    if (data[i][0] == target1) { // can repeat this part depending how many values you want to search for
      count++;
    }
    if (data[i][0] == target2) {
      count++;
    }
  }
  return (count);
}

【问题讨论】:

  • 我想您已经考虑过使用标准的电子表格功能?很容易进行计数和求和(如果您的计数或求和是直截了当的)。
  • 我已经考虑过了。这种情况下的问题是,我将获得的每个统计数据的复杂性都需要在我的工作表上放一堆电子表格代码。通过构建一个函数,虽然比单次使用的电子表格函数复杂一点,但我实际上只是简单的公式方面的事情。这也将允许我的经理根据他们将来要查找的内容或我们稍后添加其他状态来修改功能。

标签: google-apps-script


【解决方案1】:

已编辑:我错过了 var r = ss.getRange(2, 5, lrow, 1);应该是

 var r = ss.getRange(2, 5, lrow - 1, 1);  // because starting at row 2

因为您的源数据只有一列宽,所以您不需要循环中的循环,但我已将其保留,以防您希望源中包含多列。

  for (var i = 0; i < data.length ; i++) {
    for (var j = 0; j < data[i].length; j++) {
      if (data[i][j] == target) {
        count++;
      }
    }
  }

对于单个列,您可以:

  for (var i = 0; i < data.length ; i++) {
      if (data[i][0] == target) {
        count++;
    }
  }

还有内置函数:=COUNTIF(SHEET1!E2:E,"A")

【讨论】:

  • 你好 ScampMichael。从你给我看的看,我已经很接近了。虽然我尝试了您的代码,但现在当我添加 =getData("A") 时,我在该单元格中的 Google 电子表格上收到错误消息:[#NUM! - 错误:溢出。如果我尝试 =getData(A) {no quotes},那么我会得到 [#NAME? - 错误:未知范围名称 A]。
  • 嘿史蒂夫,你确实需要引号。我没有看到问题。请您编辑您的问题并将代码完全粘贴到脚本编辑器中吗?另外,只是为了笑,尝试用零初始化你的计数变量——var count = 0;
  • 就是这样。我必须声明 count = 0 并且它按预期工作。除此之外,我还能够给出多个目标。我正在将最终代码添加到上面的帖子中。非常感谢@ScampMichael。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2023-03-12
  • 2015-04-25
  • 2018-10-06
相关资源
最近更新 更多