создать формулу ФИЛЬТРА / ПОИСКА в Google Таблицах с помощью скрипта приложений, используя логику «или»
Благодаря ответу на предыдущий вопрос у меня есть скрипт приложений, который автоматически обновляет формулы в Google Таблицах, когда ключевые слова вводятся во входные ячейки для базы данных ресурсов. В настоящее время формулы работают с логикой «и» (т. Е. Результаты должны соответствовать всем условиям).
=FILTER(resources!C2:C,SEARCH(B2,resources!K2:K),SEARCH(B3,resources!L2:L))
Существует ли формула, использующая несколько формул ПОИСКА в качестве условий в формуле ФИЛЬТРА с использованием логики «или» (т. Е. Выполняется хотя бы одно из условий)?
Я попытался добавить к условиям внешние фигурные скобки и использовать знак «+», но он вернул те же результаты.
=FILTER(resources!C2:C,(SEARCH(B2,resources!K2:K))+(SEARCH(B3,resources!L2:L)))
Если да, то как можно добавить сценарий для возврата формулы? Я надеюсь, что у меня будет ячейка с проверкой данных для И и ИЛИ, которая будет использоваться в качестве ссылки для оператора IF, чтобы определить, какие конечные формулы установлены на листе. Это текущий рабочий код, в котором используется логика «и».
1 ответ
Формула - используйте QUERY:
Вместо этого вы можете использовать функцию QUERY с
<tcode id="53632735"></tcode> и логический оператор
or
. Например, если
B2
,
B3
и
B5
были заполнены, ваша формула в
A8
может быть:
=QUERY(resources!B2:P26, "SELECT B,H,I WHERE J='"&B2&"' OR K='"&B3&"' OR M='"&B5&"'")
Как видите, эта формула хороша тем, что вам нужно вызвать ее только один раз для всех трех выходных столбцов.
Фрагмент кода:
Затем, чтобы динамически построить и установить эту формулу в вашем
onEdit
функции, вы можете сделать следующее:
function onEdit(e) {
const activeSheet = e.source.getActiveSheet();
if (fcTabs.indexOf(activeSheet.getName()) !== -1 &&
e.range.columnStart == 2 && e.range.columnEnd == 2 &&
e.range.rowStart >= 2 && e.range.rowEnd <= 6) {
var cell = e.range;
const rangeReferences = [ // Attach input cells to columns
{ source: "B2", column: "J" },
{ source: "B3", column: "K" },
{ source: "B4", column: "L" },
{ source: "B5", column: "M" },
{ source: "B6", column: "P" }
];
let fcInputList = rangeReferences.map(reference => { // Loop through input cells
const ref = reference.source;
const col = reference.column;
if (activeSheet.getRange(ref).getValue() != "") {
return col + "='\"&" + ref + "&\"'"; // Build formula: eg. K='"&B3&"'
} else return '';
});
const c2 = fcSheet.getRange('C2');
if (fcInputList.every(input => input == "")) {
c2.setValue(' ⭠ set at least one search key');
fcSheet.getRange(['A8:C8']).clearContent()
} else {
fcInputList = fcInputList.filter(Boolean);
const formula = '=QUERY(resources!B2:P26, "SELECT B,H,I WHERE ' + fcInputList.join(" OR ") + '")'; // Build rest of formula
fcSheet.getRange("A8").setFormula(formula);
c2.clearContent();
}
}
}
Пример:
Примечание:
- Вы заметите, что я немного упростил ваш код, уменьшив количество повторений. Например
rangeReferences
используется, чтобы указать, какие ячейки (B2...B6
) связаны с какими столбцами (J
,K
,L
, так далее.). Таким образом, вы можете выполнять соответствующие действия в цикле. Надеюсь, это будет вам полезно.