Create in-cell dropdown with filtered range
As it stands, in Google Sheets, the only way to natively (that is, without resorting to Google Apps Script) populate drop-down lists is to use a comma-separated list, or reference a range. So in your case you would need to reproduce your filtered list somewhere in the spreadsheet (could be on a hidden sheet):
=FILTER(A2:A8;B2:B8="ANIMAL")
and then reference the range of that output in Data validation.
The ability to use a formula to generate the drop-down list directly would be a powerful feature, and has been submitted as a feature request by many (you might like to do the same: Help menu, Report an issue).
There is a solution using Google Apps Scripts.
Neat video explaining all the mechanisms involved:
- Part 1
- Part 2
Basically, by editing any cell on which your drop-down depends (e.g. Country for City list), for the related "City" cell it will automatically recalculate the range for validation data (list of possible Cities).
Copy/pasting the script here just in case it becomes unavailable (that example used makes & models of cars for dependent drop-downs):
function onEdit() {
var tabLists = "lists";
var tabValidation = "Main";
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabLists);
var activeCell = ss.getActiveCell();
if (activeCell.getColumn() == 1 && activeCell.getRow() > 1 && ss.getSheetName() == tabValidation){
activeCell.offset(0, 1).clearContent().clearDataValidations();
var makes = datass.getRange(1, 1, 1, datass.getLastColumn()).getValues();
var makeIndex = makes[0].indexOf(activeCell.getValue()) + 1;
if (makeIndex != 0){
var validationRange = datass.getRange(3, makeIndex, datass.getLastRow());
var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
activeCell.offset(0, 1).setDataValidation(validationRule);
}
}
}