【问题标题】:indexOf not working in Google Apps ScriptindexOf 在 Google Apps 脚本中不起作用
【发布时间】:2018-01-26 02:31:21
【问题描述】:

我正在制作一个用于分析我的银行交易历史记录的 Google 表格文档。我的许多交易描述都以相同的字母开头,特别是“SIG”(正确的大小写)。我想统计这些交易的数量,但我不能。

为了进行故障排除,我确保 indexOf 在我只检查一个单元格/输入时有效。在单元格中找不到“SIG”时返回“-1”,在单元格开头找到“SIG”时返回“0”。

再次进行故障排除,我还确保我正确循环了一个数组(多个单元格),该数组仅计算非空单元格的数量。这也有效。

当我试图把所有东西放在一起时,我无法让它工作,我不知道为什么。短函数如下。感谢您的帮助。

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

【问题讨论】:

  • 您是否可以在不暴露您的个人信息的情况下硬编码一个数组并使用硬编码的数组更新您的问题
  • 代码看起来应该可以工作,虽然你应该写== 0,因为indexOf()返回的是一个数字,而不是一个字符串。
  • 如果你这样做console.log(descriptions[i], SIG_checker)你会看到什么?
  • 我猜 descriptions 是一个二维数组,而 descriptions[i] 指的是一个一维数组。因此,descriptions[i].indexOf("SIG") 正在调用 indexOf array prototype function。哪个需要完美匹配
  • @user6069863:我已经包含了一个示例数组。

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


【解决方案1】:

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

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)))

【讨论】:

  • 非常感谢!自定义代码和内置函数都有效。感谢其他所有人的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
相关资源
最近更新 更多