首页 > 解决方案 > Google Apps 脚本 - “indexOf”方法的使用

问题描述

第一:我真的很努力相处,但我更多的是支持者而不是程序员。

我在 Google Calc 中输入了一些文本,并想检查“Mueller, Klaus”的出现次数(在数据范围内出现 5 次)。该工作表包含 941 行和 1 列(“A”)。

这是我要找出的代码:

function countKlaus() {
  
  // Aktives Spreadsheet auswählen

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  
  
  // Aktives Tabellenblatt auswählen
  var sheet = ss.getSheetByName("Tabellenblatt1");

  var start = 1;
  var end = sheet.getLastRow();

  var data = sheet.getRange(start,1,end,1).getValues();
  var curRow = start;
  var cntKlaus = 0;
  
  for( x in data )
  {
    var value = daten[x];
    //ui.alert(value);
    if(value.indexOf("Mueller, Klaus")> -1){
      cntKlaus = cntKlaus + 1;
    }
  }
 
  ui.alert(cntKlaus);
  
}

结果消息是“0”,但应该是“5”。

标签: javascriptloopsgoogle-apps-scriptgoogle-sheetsspreadsheet

解决方案


问题:

您非常接近解决方案,除了以下两个问题:

  • daten[x]应替换为data[x].

  • ui.alert(cntKlaus)应替换为SpreadsheetApp.getUi().alert(cntKlaus).

解决方案(由我优化) - 推荐:

function countKlaus() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Tabellenblatt1");
  const cntKlaus = sheet
                   .getRange('A1:A' + sheet.getLastRow())
                   .getValues()
                   .flat()
                   .filter(r=>r.includes("Mueller, Klaus"))
                   .length;
  SpreadsheetApp.getUi().alert(cntKlaus);
}

您可以忽略此术语+ sheet.getLastRow(),因为我们正在过滤非空白值。但我认为首先使用更少的数据来使用过滤器会更快。

参考:

  • flat:将二维数组转换为一维数组。
  • 过滤器:仅过滤"Mueller, Klaus".
  • Array.prototype.length:获取过滤后数据的长度,也就是想要的结果。
  • 包括:检查是否Mueller, Klaus包含在文本中。

奖金信息

仅供参考,如果这对您很重要,我的解决方案可以用一行代码重写:

SpreadsheetApp.getUi().alert(SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tabellenblatt1").getRange('A1:A').getValues().flat().filter(r=>r.includes("Mueller, Klaus")).length);

推荐阅读