使用Google Apps Script无法从DataSourceSheet获取筛选条件:getHiddenValues()返回空
解决Google Sheets BigQuery数据源工作表筛选条件获取问题
你遇到的核心问题是:BigQuery数据源工作表中,cargo列的「仅显示特定值」筛选无法通过常规Filter.getFilterCriteria()方法获取条件(返回null类型、空值数组),但日期类筛选正常。这是因为常规Filter API对BigQuery数据源的枚举型筛选支持有限,这类筛选的元数据存储在数据源专属的筛选对象中。
方案1:改用DataSourceFilter专属API
针对BigQuery数据源工作表,应使用getDataSourceFilters()替代常规的getFilters(),直接获取数据源层面的筛选条件,该API能正确识别枚举值选择类筛选:
function labExport(){ SpreadsheetApp.enableBigQueryExecution(); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Orders').asDataSourceSheet(); // 获取数据源专属筛选对象 const dataSourceFilters = sheet.getDataSourceFilters(); for (const filter of dataSourceFilters){ const columnName = filter.getColumn().getName(); const criteria = filter.getCriteria(); const criteriaType = criteria.getType(); Logger.log(`${columnName} has filter. \n -- Filter type is ${criteriaType}.`); // 根据筛选类型处理 if (criteriaType === SpreadsheetApp.DataSourceFilterCriteriaType.VALUE_IN_LIST) { // 仅显示列表中的值,直接获取显示的目标值 const visibleValues = criteria.getValues(); Logger.log(`--- Visible values: ${JSON.stringify(visibleValues)}`); } else if (criteriaType === SpreadsheetApp.DataSourceFilterCriteriaType.DATE_AFTER) { const criteriaValues = criteria.getValues(); Logger.log(`--- Criteria values: ${JSON.stringify(criteriaValues)}`); } } }
方案2:添加重试机制验证加载延迟
如果怀疑是大数据源加载延迟导致元数据未就绪,可以添加重试+等待逻辑,确保筛选元数据完全加载:
function labExport(){ SpreadsheetApp.enableBigQueryExecution(); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Orders').asDataSourceSheet(); let dataSourceFilters = []; // 最多重试3次,每次间隔1秒 for (let retryCount = 0; retryCount < 3; retryCount++) { SpreadsheetApp.flush(); // 强制刷新工作表状态 dataSourceFilters = sheet.getDataSourceFilters(); if (dataSourceFilters.length > 0) break; Utilities.sleep(1000); } for (const filter of dataSourceFilters){ const columnName = filter.getColumn().getName(); const criteria = filter.getCriteria(); const criteriaType = criteria.getType(); Logger.log(`${columnName} has filter. \n -- Filter type is ${criteriaType}.`); if (criteriaType === SpreadsheetApp.DataSourceFilterCriteriaType.VALUE_IN_LIST) { const visibleValues = criteria.getValues(); Logger.log(`--- Visible values: ${JSON.stringify(visibleValues)}`); } else if (criteriaType === SpreadsheetApp.DataSourceFilterCriteriaType.DATE_AFTER) { const criteriaValues = criteria.getValues(); Logger.log(`--- Criteria values: ${JSON.stringify(criteriaValues)}`); } } }
关键说明
- 日期类筛选(如DATE_AFTER)能被常规Filter API识别,是因为这类范围型筛选的元数据格式和本地工作表筛选兼容;而枚举值选择类筛选是BigQuery数据源专属的筛选逻辑,仅能通过
DataSourceFilterAPI解析。 VALUE_IN_LIST类型对应你设置的「仅显示cargo为'cargo name 1'」的筛选,getValues()会直接返回你需要的目标值数组。
内容的提问来源于stack exchange,提问作者Pavel Mertvago
相关产品推荐
相关产品推荐

