谷歌脚本搜索并返回单元格位置

3

我有一个关于谷歌脚本的问题,希望能得到一些帮助。

目标:在多个工作表中搜索一个值,并返回匹配项的单元格位置。

我尝试过使用以下脚本:

/**
* Finds a value within a given range. 
* @param value The value to find.
* @param range The range to search in.
* @return A range pointing to the first cell containing the value, 
*     or null if not found.
*/
function find(value, range) {
var data = range.getValues();
for (var i = 0; i < data.length; i++) {
for (var j = 0; j < data[i].length; j++) {
if (data[i][j] == value) {
return range.getCell(i + 1, j + 1);
}
}
}
return null;
}

然而,它返回错误“TypeError:无法在对象中找到getValues函数”
我的值将被定义为文本字符串,例如“ABCD”
我的范围将是多个工作表的范围,例如sheet1!A1:C4,sheet2!A1:C4
该函数应返回查找值的工作表、列和行
目前,我正在使用iferror index match循环公式逐列搜索工作表(我使用间接作为我的范围是可变的),但希望有一个脚本可以使这更容易和更快。
=IFERROR(index(INDIRECT(Sheet1!A:A),
iferror(MATCH(A2,INDIRECT(Sheet1!B:B),0),
iferror(MATCH(A2,INDIRECT(Sheet1!C:C),0),
...ETC

感谢您提前给予的任何帮助。
谢谢。
2个回答

1
尝试这个:

function find(value, range) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = range.split("!")[0];
  var A1Ref = range.split("!")[1];
  var activeRange = ss.getSheetByName(sheet).getRange(A1Ref);
  var data = activeRange.getValues();
  for (var i = 0; i < data.length; i++) {
    for (var j = 0; j < data[i].length; j++) {
      if (data[i][j] == value) {
        return (ss.getSheetByName(sheet).getRange(i + 1, j + 1));
      }
    }
  }
  return null;
}

这将返回范围。您可以更改该行以获取A1表示法:
return (ss.getSheetByName(sheet).getRange(i + 1, j + 1).getA1Notation());

不需要手动解析范围字符串,有一个方法可以完成。 - Zig Mandel

0
更新至Akshin Jalilov的答案 - 原始答案对我而言没有返回正确的单元格位置。我已经更新了答案以包括在响应中进行单元格位置计算。
// original: https://dev59.com/Dmkw5IYBdhLWcg3waZ_4
// updated: https://gist.github.com/mark05e/29bb2b7564460059da6d3e74f08ab31f
function find(value, range) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = range.split("!")[0];
    var A1Ref = range.split("!")[1];
    
    var [cellStart, cellEnd] = A1Ref.split(":")
    var rowStartNumber = Number(cellStart.replace(/[^0-9]/g,''))
    var rowEndNumber = Number(cellEnd.replace(/[^0-9]/g,''))
    var colStart = cellStart.replace(/[^A-Za-z]/g,'')
    var colStartNumber = Number(lettersToNumber(colStart))
    var colEnd = cellEnd.replace(/[^A-Za-z]/g,'')
    var colEndNumber = Number(lettersToNumber(colEnd))

    var searchRange = ss.getSheetByName(sheet).getRange(A1Ref);
    var searchData = searchRange.getValues();
    for (var i = 0; i < searchData.length; i++) {
        for (var j = 0; j < searchData[i].length; j++) {
            if (searchData[i][j] == value) {
                return (ss.getSheetByName(sheet)
                        .getRange(rowStartNumber + i, colStartNumber + j)
                        .getA1Notation());
            }
        }
    }
    return null;
}

// https://dev59.com/Dmkw5IYBdhLWcg3waZ_4
function lettersToNumber(letters){
    for(var p = 0, n = 0; p < letters.length; p++){
        n = letters[p].charCodeAt() - 64 + n * 26;
    }
    return n;
}

// Test Function
function testFind(name) {
    let x = find("Region1","Sheet1!C3:C14")
    console.log(x)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接