Google Apps脚本 - 根据单元格值查找行号

jjo*_*312 7 google-apps-script

我正在寻找一些帮助,找到包含特定值的单元格的行号.

电子表格包含多个行和列的大量数据.我正在遍历.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);
      }
    }    
  }  
}
Run Code Online (Sandbox Code Playgroud)

输出时,Logger.log(row)它给出了我正在寻找的值.我想确定每个值在哪一行,因此我可以在X行数和X列上下载以获取其他单元格的内容.

Did*_* A. 6

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

所以相反,最好这样做:

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;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要传递您想要的完整列范围,如下所示:

rowOf("MyTextToLookFor", 'MySheetToLookIn'!A1:A)
Run Code Online (Sandbox Code Playgroud)

您可以在哪里用您选择的列替换A,用您的工作表名称替换MySheetToLookIn,用您要查找的文本替换MyTextToLookFor.

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

  • 我尝试使用您的行 rowOf("MyTextToLookFor", 'MySheetToLookIn'!A1:A) 来达到我的目的,如下所示: var boldRow = rowOf("Σ", 'MK_Help'!A7:A); 我收到错误:参数列表后缺少 ) !;(我错过了什么吗? (2认同)

Vri*_*ies 6

自 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";
}
Run Code Online (Sandbox Code Playgroud)


小智 6

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
}
Run Code Online (Sandbox Code Playgroud)


vis*_*sch 5

我对谷歌应用程序了解不多,但[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
      }
    }    
  }  
}
Run Code Online (Sandbox Code Playgroud)