【问题标题】:Google Apps Script - Find Row number based on a cell valueGoogle Apps 脚本 - 根据单元格值查找行号
【发布时间】:2014-07-16 16:27:46
【问题描述】:

我正在寻找有关查找包含特定值的单元格的行号的帮助。

电子表格包含多行多列的大量数据。我正在遍历 .getDataRange 并且可以找到包含我正在寻找的值的单元格。找到后,我想知道他的单元格所在的行,以便我可以进一步获取其他单元格值,因为我确切地知道有多少行和/或附加信息上的列来自找到的单元格。

这里是一些用于查找包含特定字符串的单元格的代码。

function findCell() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var dataRange = sheet.getDataRange();
  var values = dataRange.getValues();

  for (var i = 0; i < values.length; i++) {
    var row = "";
    for (var j = 0; j < values[i].length; j++) {     
      if (values[i][j] == "User") {
        row = values[i][j+1];
        Logger.log(row);
      }
    }    
  }  
}

当输出Logger.log(row) 时,它会为我提供我正在寻找的值。我想确定每个值在哪一行,所以我可以向下 X 行和 X 列来获取其他单元格的内容。

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    此方法查找特定列中给定值的行号:

    function rowOf(containingValue, columnToLookInIndex, sheetIndex) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheets();
      var dataRange = sheet[sheetIndex].getDataRange();
      var values = dataRange.getValues();
    
      var outRow;
    
      for (var i = 0; i < values.length; i++)
      {
        if (values[i][columnToLookInIndex] == containingValue)
        {
          outRow = i+1;
          break;
        }
      }
    
      return outRow;
    }
    

    但是如果你这样做,它不会刷新,除非你改变任何参数,这是因为自定义函数应该是确定性的,也就是说,对于相同的参数,它应该总是给出相同的结果。

    因此,最好这样做:

    function rowOf(containingValue, range) { 
      var outRow = null;
    
      if(range.constructor == Array)
      {
        for (var i = 0; i < range.length; i++)
        {
          if(range[i].constructor == Array && range[i].length > 0)
          {
            if (range[i][0] == containingValue)
            {
              outRow = i+1;
              break;
            }
          }
        }
      }
    
      return outRow;
    }
    

    在这种情况下,您需要像这样传递您要查找的整个列范围:

    rowOf("MyTextToLookFor", 'MySheetToLookIn'!A1:A)
    

    您可以将 A 替换为您选择的列,将 MySheetToLookIn 替换为工作表名称,将 MyTextToLookFor 替换为您要查找的文本。

    这将允许它在添加行和删除行时刷新。

    【讨论】:

    • 我尝试使用你的行 rowOf("MyTextToLookFor", 'MySheetToLookIn'!A1:A) 来达到我的目的: var boldRow = rowOf("∑", 'MK_Help'!A7:A );我得到错误:参数列表后缺少)! ;(我错过了什么吗?
    【解决方案2】:

    我对谷歌应用了解不多,但在这种情况下,[i] 似乎是您的行号。

    所以如果你做了类似的事情:

    function findCell() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var dataRange = sheet.getDataRange();
      var values = dataRange.getValues();
    
      for (var i = 0; i < values.length; i++) {
        var row = "";
        for (var j = 0; j < values[i].length; j++) {     
          if (values[i][j] == "User") {
            row = values[i][j+1];
            Logger.log(row);
            Logger.log(i); // This is your row number
          }
        }    
      }  
    }
    

    【讨论】:

    • 是的,这确实给了我整行数据。它没有给我的是行号,因为它只是将行作为任何数组返回。 [ABC,DEF,GHI,etc....] 例如,我需要知道这一行是第 13 行。
    • for info : 数组从 0 开始计数,行从 1 开始,所以这个函数返回的值不是行号而是它的值 -1...(见另一个答案,他做得对;-)
    • 浏览每一列似乎非常耗时。有没有更有效的方法?
    【解决方案3】:

    自 2018 年以来,这可以使用 flat() 在不循环的情况下完成。

    function findRow(searchVal) {
      var sheet = SpreadsheetApp.getActiveSheet();
      var data = sheet.getDataRange().getValues();
      var columnCount = sheet.getDataRange().getLastColumn();
    
      var i = data.flat().indexOf(searchVal); 
      var columnIndex = i % columnCount
      var rowIndex = ((i - columnIndex) / columnCount);
    
      Logger.log({columnIndex, rowIndex }); // zero based row and column indexes of searchVal
    
      return i >= 0 ? rowIndex + 1 : "searchVal not found";
    }
    

    【讨论】:

      【解决方案4】:

      ES6 为我们提供了一个单一的衬里(但扩展了完整的细节)。

      function findRow() {
        const ss = SpreadsheetApp.getActiveSpreadsheet();
        const sheet = ss. getActiveSheet(); // OR GET DESIRED SHEET WITH .getSheetByName()
        const dataRange = sheet.getDataRange();
        const values = dataRange.getValues();
        const columnIndex = 3 // INDEX OF COLUMN FOR COMPARISON CELL
        const matchText = "User"
      
        const index = values.findIndex(row => row[columnIndex] === matchText)
        const rowNumber = index + 1
        return rowNumber
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        • 2019-07-07
        • 1970-01-01
        相关资源
        最近更新 更多