#javascript #google-apps-script #indexof
#javascript #google-apps-script #indexof
Вопрос:
кодирование простого веб-сайта в Google App Script
есть электронная таблица в Google Sheet — 2 столбца — в 1-м есть существительные, а во 2-м описательные слова
что-то лежит в этом:
Столбец 1 — Столбец 2
стол — дерево
шарик — пластиковый
стул — металлический синий
мой код ищет ключевое слово во 2-м столбце и возвращает совпадение из 1-го столбца. он отлично работает, когда в столбце 2 есть одно слово, но не тогда, когда их больше … поэтому поиск «wood» возвращает таблицу, поиск «plastic» возвращает ball, но поиск «metal» ничего не возвращает, и то же самое для «blue»
есть идеи, как это решить?
function FilterResults(keyword){
//connect with spreadsheet
var ss = SpreadsheetApp.openByUrl(url);
var ws = ss.getSheetByName("sheet1");
var sheetData = ws.getRange(1,1,ws.getRange("A1").getDataRegion().getLastRow(),5).getValues();
//create arrays of values from cells in each column
var Column1List = sheetData.map(function(r){return r[0]; });
var Column2List = sheetData.map(function(r){return r[1]; });
//make sure search tags are in string format
var x = keyword.toString();
//find 1st row(position) that has tag in it
var position = Column2List.indexOf(x);
if (position > -1){
//if the search found a match return cell content according to row number
return Column1List[position];
}else{
return "unavailable";
}
Комментарии:
1. Как вы
Column2List
выглядите в случае двух или более ключевых слов? Вы пробовали регистрировать это в консоли?2. он содержит слова, разделенные только пробелом… журнал массива возвращает «дерево, пластик, металл синего цвета и т. Д. …»
Ответ №1:
Ваша проблема в строке var position = Column2List.indexOf(x);
, indexOf возвращает точное совпадение, вы должны использовать findIndex и передать функцию для поиска по вашему ключевому слову:
var position = Column2List.findIndex( s => s.indexOf(x) >= 0 )
Редактировать:
Если вы хотите найти индекс после некоторого индекса, slice скопирует массив, обходным путем будет добавление условия к функции: (s, i) => i >= index amp;amp; s.indexOf(x) >= 0
Но если я вас правильно понял, вы могли бы просто использовать .filter
on sheetData
:
sheetData.filter(r => r[1].indexOf(keyword) >= 0 )
Комментарии:
1. спасибо за решение — оно работает, но представляет мне другую проблему… Мне нужно запустить это в цикле, чтобы найти все строки с соответствующими ключевыми словами — я использую while{} и с помощью indexOf() я могу указать начальную позицию (обновляется в каждом цикле с позиции, найденной ранее) — я не могу понять, как заставить findIndex начать поиск по определенному индексу… Я мог бы использовать slice, я думаю, но с дюжиной совпадающих результатов в таблице из более чем 1000 строк это может быть настоящей проблемой…
2. Я улучшил ответ