在电子表格中按列值搜索行的正确方法是什么 API

What is proper way of searching a row by column value in spreadsheets API

我正在尝试在 spreadsheet(Google 工作表)API 中按列值搜索 Google 文档有 API 可用于查找和替换,但没有 API 可用于 find/search。

一些方法我已经尝试过在传播中实现按值搜索sheet。

  1. Google 可视化 API 查询语言:此方法返回匹配值的行。

    部分问题回复:

    a) 不返回行号(无索引)

    b) 搜索区分大小写

    是否可以在该方法的结果中获取行号?

  2. 设置列

    =ROW(INDIRECT(ADDRESS(MATCH("search_string",B:B,0),1)))

得到行号例如:2

然后通过按范围获取值获取行: https://sheets.googleapis.com/v4/spreadsheets/1Y65ZA5mhyImLL00yGR3lqwtbm6MgGLV0nV014fRXhts/values/A2:Z2

这不是正确的方法,我必须使用公式创建一个单元格,然后在该单元格中按值查找行,并在搜索完成后清除销售。

*This approach returns only one row.
  1. DeveloperMetadataLookup:我不知道如何使用它 我在 sheet 上创建了元数据 元数据密钥:key1 元数据值:值 1

    搜索 spreadsheets.values.batchGetByDataFilter

    using dataFilter:DeveloperMetadataLookup{"metadataKey":"key1","metadataValue":"value1"}

这将返回 sheet 中的所有行我不知道如何使用此方法查找特定行。

  1. Google Apps Text Finder:我不知道这是否可以免费使用 spreadsheet API.

  2. 基本过滤器:我读到过这个但不知道如何使用它进行搜索。

  3. 一些相同主题的旧问题建议获取所有行并循环它们以按值获取行。

    示例:这会挂起我的服务器,我不想实现这个循环。

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

结论:

  1. 任何人都可以帮助我找到在 sheet 中按列值搜索行的正确方法吗?

  2. 是否可以使用(DeveloperMetadataLookup 或 Basic Filter)按列值搜索行 如果是,请建议我正确的使用方法。

  3. Google 可视化 API 查询语言:是否可以获取行号?

这是一个例子sheet

Column-> A, B, C

Row1->B-15, planY, 50
Row2->B-18, planZ, 80
Row3->B-19, planC, 70
Row4->B-21, planZ, 90

我的需求搜索column:B = value:planZ | (B=计划Z)

结果应该与此类似:

Row:{
"2":["B-18","planZ","80"],
"4":["B-21","planZ","90"]
}

测试了 This thread 函数并进行了一些修改以在电子表格中进行搜索,我得到了行号和行值(该行的所有单元格)。

function doGet(e = {
    "parameter": {
        "value": "planc",
        "spreadsheetId": "1Y65ZA5mhyImLL00yGR3lqwtbm6MgGLV0nV014fRXhts",
        "column": "B",
        "headerStatus": true
    }
}) {
    var findText = e.parameter.value;
    var spreadsheetId = e.parameter.spreadsheetId;
    var column = e.parameter.column;
    var ss = SpreadsheetApp.openById(spreadsheetId);
    var ranges = ss.createTextFinder(findText).findAll();
    var headerStatus = e.parameter.headerStatus;
    if (headerStatus == true || headerStatus == "true") {
        var header = ss.getRange("A1:Z1").getValues()[0];
    }
    var res = ranges.map(r => ({
        row: r.getRow(),
        value: r.getSheet().getRange(`A${r.getRow()}:Z${r.getRow()}`).getValues()[0]
    }));
    var result = {};
    var allColumn = {
        "A": 0,
        "B": 1,
        "C": 2,
        "D": 3,
        "E": 4,
        "F": 5,
        "G": 6,
        "H": 7,
        "I": 8,
        "J": 9,
        "K": 10,
        "L": 11,
        "M": 12,
        "N": 13,
        "O": 14,
        "P": 15,
        "Q": 16,
        "R": 17,
        "S": 18,
        "T": 19,
        "U": 20,
        "V": 21,
        "W": 22,
        "X": 23,
        "Y": 24,
        "Z": 25
    };
    var columnIndex = allColumn[column];
    for (var key in res) {
        var getRow = res[key]["row"];
        var getValue = res[key]["value"];
        if (getValue[columnIndex].toLowerCase() == findText.toLowerCase()) {
            if (headerStatus == true || headerStatus == "true") {
                var headerValueObj = {};
                for (var i = 0; i < header.length; i++) {
                    if (header[i] !== "") {
                        var headerName = header[i];
                        headerValueObj[headerName] = getValue[i];
                    }
                }
                result[getRow] = headerValueObj;
            } else {
                result[getRow] = getValue;
            }
        }
    }
    return result;
}

输出结果

"result": {
      "4": {
        "Price": 20,
        "heading4": "",
        "Id": "B-16",
        "Plan": "PlanC"
      },
      "7": {
        "Price": 8,
        "heading4": "",
        "Id": "B-24",
        "Plan": "PlanC"
      }
    }