我正在寻求一些帮助来查找包含特定值的单元格的行号。
电子表格包含大量跨行和列的数据。我正在循环 .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 列来获取其他单元格的内容。
我对谷歌应用程序不太了解,但在这种情况下,看起来
[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
}
}
}
}
此方法查找特定列中给定值的行号:
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 替换为您要查找的文本。
这将允许它在添加行和删除行时刷新。
自 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";
}
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
}
这可以使用文本查找器来完成:
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
如果您想要行号,请查看此代码,这会对您有帮助
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.
要根据特定列(在本例中为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变量。