Как правильно искать строку по значению столбца в API электронных таблиц - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь выполнить поиск по значению столбца в электронной таблице (Google Таблицы). API Документация Google, имеющая API для поиска и замены, но не имеющая API для поиска / поиска. по значению в электронной таблице.

  1. Язык запросов API визуализации Google: этот подход возвращает строки, соответствующие значениям.

    Некоторые проблемы в ответ:

    a) Не возвращается номер строки (Без индексации)

    б) поиск чувствителен к регистру

    Можно ли получить номер строки в результате этого метода?

  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.

DeveloperMetadataLookup: я не знаю, как это использовать Я создал метаданные на листе с помощью metadataKey: key1 metadataValue: value1

Поиск по таблицам.values.batchGetByDataFilter

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

Это возвращает все строки на листе, я не знаю, как найти определенную c строку с помощью этого метода.

Google Apps Text Finder: я не знаю, можно ли это бесплатно использовать с API электронных таблиц.

Basi c Фильтр: я читал об этом, но не знаю Не знаю, как использовать его для поиска.

Некоторые старые вопросы по тому же топу c, предлагающие получить все строки и oop их, чтобы получить строку по значению.

Пример: это приведет к зависанию моего сервера, я не хочу реализовывать это l oop.

    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. Может ли кто-нибудь помочь мне найти правильный способ поиска строки по значению столбца на листах?

  2. Можно ли искать строку по значению столбца с помощью (DeveloperMetadataLookup или Basi c Filter) Если да, то предложите мне правильный способ его использования.

  3. Язык запросов API визуализации Google: можно ли получить номер строки?

Это пример листа

Column-> A, B, C

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

Мой столбец поиска требований: B = значение: planZ | (B = planZ)

Результат должен быть примерно таким:

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

1 Ответ

0 голосов
/ 05 августа 2020

Протестировано Эта функция потока с некоторыми модификациями для поиска в электронной таблице, и я получил номер строки и значения строки (все ячейки этой строки).

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

...