indexOf无法在Google Apps脚本中使用

时间:2018-01-26 02:31:21

标签: javascript arrays google-apps-script google-sheets indexof

我制作的Google表格文档分析了我的银行交易历史记录。我的一些交易描述以相同的字母开头,特别是" SIG" (正确的套管)。我想计算这些交易的数量,但我不能。

为了排除故障,我确保在我只检查一个小区/输入时indexOf有效。它返回" -1"当它无法找到" SIG"在单元格和" 0"当它找到" SIG"在细胞的开头。

再次排除故障,我还确保我正确地循环通过一个数组(多个单元格),这个数组只计算非空单元格的数量。这也有效。

当我试图将所有东西放在一起时,我无法让它工作,我不知道为什么。短功能如下。谢谢你的帮助。

function SIG_counter (descriptions) {
  var SIG_total = 0;
  var SIG_checker;
  for (var i=0; i<descriptions.length; i++) {
    var SIG_checker = descriptions[i].indexOf("SIG");
    Logger.log(descriptions[i]);
    Logger.log(SIG_checker);
    if (SIG_checker == 0.0) {
      SIG_total++;
    }
  }
  return SIG_total;
}

var sample_array = ["Funds Added (Donation)",
                    "SIG POS purchase at Paypal",
                    "PIN POS purchase cashback",
                    "PIN POS purchase cashback",
                    "SIG POS purchase at Paypal"]

function trouble_shooter () {
  SIG_counter(sample_array);
}

日志:

[18-01-28 15:30:54:630 PST] Funds Added (Donation)
[18-01-28 15:30:54:630 PST] -1.0
[18-01-28 15:30:54:631 PST] SIG POS purchase at Paypal
[18-01-28 15:30:54:631 PST] 0.0
[18-01-28 15:30:54:632 PST] PIN POS purchase cashback
[18-01-28 15:30:54:632 PST] -1.0
[18-01-28 15:30:54:632 PST] PIN POS purchase cashback
[18-01-28 15:30:54:633 PST] -1.0
[18-01-28 15:30:54:633 PST] SIG POS purchase at Paypal
[18-01-28 15:30:54:634 PST] 0.0

1 个答案:

答案 0 :(得分:1)

当列(例如:B1:B22)是自定义函数的输入时,范围将转换为2D数组并传递给函数。如果您输入一行(Ex B9:F9),它将转换为1D数组。 在这种情况下,您将列传递给函数,因此它将转换为2D数组。所以coressponding样本数组应如下所示:

var sample_array = [["Funds Added (Donation)"],
                    ["SIG POS purchase at Paypal"],
                    ["PIN POS purchase cashback"],
                    ["PIN POS purchase cashback"],
                    ["SIG POS purchase at Paypal"]]

您需要提供第二维的索引,例如descriptions[i][0],其中[i]表示第一维,[0]表示第二维。 因此,如果您的样本数组

sample_array[0][0] = "Funds Added (Donation)"
sample_array[1][0] = "SIG POS purchase at Paypal"

等等。

您修改后的功能如下所示:

function SIG_counter (descriptions) {

  var SIG_total = 0;
  var SIG_checker="";
  if(descriptions.map){ //Check if the arugment is array
                        //This code assumess it is always a 2D or a single value
  for (var i=0; i<descriptions.length; i++) {
    SIG_checker = descriptions[i][0].indexOf("SIG");
    Logger.log(descriptions[i][0]);
    Logger.log(SIG_checker);
    if (SIG_checker == 0.0) {
      SIG_total++;
    }
  } } else { //if arugment is not array, it refers to a single cell
    if(descriptions.indexOf("SIG") == 0.0){
      SIG_total = 1
    }

  }
  return SIG_total;
}

请按此documentation进一步参考。

最后注意事项:上述功能仅在选择了列或单个单元格时才有效。如果选择了一行,则会出错!

编辑:等效地,您可以使用此内置函数执行相同的操作

=Arrayformula(sum(iferror(find("SIG",B1:B200),0)))