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列上下载以获取其他单元格的内容.
此方法查找给定值的特定列中的行号:
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.
这将允许它在添加行和删除行时刷新.
自 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)
我对谷歌应用程序了解不多,但[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)
| 归档时间: |
|
| 查看次数: |
26890 次 |
| 最近记录: |