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

问题描述 投票:0回答:7

我正在寻求一些帮助来查找包含特定值的单元格的行号。

电子表格包含大量跨行和列的数据。我正在循环 .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
7个回答
8
投票

我对谷歌应用程序不太了解,但在这种情况下,看起来

[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
      }
    }    
  }  
}

8
投票

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

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 替换为您要查找的文本。

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


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";
}

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
}

5
投票

这可以使用文本查找器来完成:

function findRow(searchValue){
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var thisSheet = ss.getActiveSheet();
   var tf = thisSheet.createTextFinder(searchValue)
   var thisRow = tf.findNext().getRow()
   return thisRow
}

通过这篇文章发现:Google 应用程序脚本在电子表格中查找文本并返回位置索引

实现:https://developers.google.com/apps-script/reference/spreadsheet/text-finder


0
投票

如果您想要行号,请查看此代码,这会对您有帮助

var ss = SpreadsheetApp.getActiveSpreadsheet();
var form = ss.getSheetByName("form");//the sheet where the search value in
var data = ss.getSheetByName("data");//the sheet where the data in
var searchvalue = form.getRange("L3").getValue();//the value that you want to find its row noumber in the data sheet
var vCol = data.getRange(1,1,data.getLastRow(),1).getValues();// vCol is all the values in the coulum you search in it, make sure to chose the right coulmn number when you define the vCol
var rowNumber = sCol.flat().indexOf(searchvalue) + 1;// and that's it, rowNumber = the row number of the value you are looking for.

-1
投票

要根据特定列(在本例中为invoice_id列)的值在Google表格中查找一行并编辑该行中的另一列(在本例中为发送列),您可以使用以下脚本:

// Replace "Sheet1" with the name of your sheet
var sheet = SpreadsheetApp.getActive().getSheetByName("Sheet1");

// Replace "A" with the column letter for the invoice_id column
// and "B" with the column letter for the send column
var invoiceIdColumn = "A";
var sendColumn = "B";

// Replace "12345" with the invoice_id you want to search for
var invoiceIdToSearch = "12345";

// Find the row number of the row with the matching invoice_id
var data = sheet.getDataRange().getValues();
var row = data.findIndex(row => row[invoiceIdColumn - 1] == invoiceIdToSearch) + 1;

// If a row with the matching invoice_id was found
if (row) {
  // Set the value of the send column in that row to "true"
  sheet.getRange(row, sendColumn).setValue(true);
}

此脚本将在整个工作表中搜索发票_id 值与invoiceIdToSearch 变量匹配的行,然后将该行中的发送列的值设置为true。

请注意,此脚本假定发票_id 列是工作表中的第一列(A 列),发送列是第二列(B 列)。如果您的列位于不同的位置,您将需要相应地调整invoiceIdColumn和sendColumn变量。

© www.soinside.com 2019 - 2024. All rights reserved.