Подход
В этом случае я бы использовал пользовательскую функцию, чтобы вы могли получить больший контроль над логикой c и структурой вашего листа. Сначала нужно изменить, переместить лист категорий в структуру строк, так как Google Sheets получает значения таким образом.
Теперь давайте создадим функцию, которая извлекает данные из категорий и присваивает каждое имя соответствующему.
Это пользовательская функция, поэтому я создаю правильный заголовок документа, чтобы он был виден в контексте вашей таблицы.
/**
* Assign the name the corresponding category.
*
* @param {input} the name to assign to the category
* @return The matching category
* @customfunction
*/
function MATCHCATEGORY(input) {
// if the input is from ARRAYFORMULA I will reiterate along the array with a map
if (input.map) {
return input.map(MATCHCATEGORY)
} else {
// Recursion base case
// I will get the categories rows
var rows = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("CATEGORIES").getDataRange().getValues();
var category = "";
// Now I will map a string matching function along the rows
rows.map(row => {
let no_blanks = row.filter(value => value != "");
for (var i=1; i<no_blanks.length; i++) {
if (input.includes(row[i])) {
category = row[0];
break;
}
}
});
// Finally I return the category
return category
}
}
Теперь мы можем использовать нашу пользовательскую функцию внутри ARRAYFORMULA:
=ARRAYFORMULA(MATCHCATEGORY("ENTRY COLUMN RANGE"))