Csv 将Google Visualization CategoryFilter应用于包含逗号分隔值列表的电子表格列

Csv 将Google Visualization CategoryFilter应用于包含逗号分隔值列表的电子表格列,csv,charts,google-apps-script,google-sheets,google-visualization,Csv,Charts,Google Apps Script,Google Sheets,Google Visualization,我已经根据创建了一个表格图表,并发布了web应用程序。该数据源包含Google表单响应。两列包含逗号分隔值的列表,这些值是表单检查表项的响应。我对这些列应用了“CategoryFilter”。但是,它没有对每个逗号分隔的值进行个性化处理,而是将其视为一个值 我希望过滤器根据逗号分隔这些值,然后将它们堆叠在下拉列表中。有办法做到这一点吗 我曾尝试根据API为“等级级别”过滤器的值创建值,但当我在过滤器中选择一个值时,它没有找到结果(我假设,因为CategoryFilter没有进行部分匹配) 加载

我已经根据创建了一个表格图表,并发布了web应用程序。该数据源包含Google表单响应。两列包含逗号分隔值的列表,这些值是表单检查表项的响应。我对这些列应用了“CategoryFilter”。但是,它没有对每个逗号分隔的值进行个性化处理,而是将其视为一个值

我希望过滤器根据逗号分隔这些值,然后将它们堆叠在下拉列表中。有办法做到这一点吗

我曾尝试根据API为“等级级别”过滤器的值创建值,但当我在过滤器中选择一个值时,它没有找到结果(我假设,因为CategoryFilter没有进行部分匹配)


加载电子表格时,
在列上使用数据表方法
getDistinctValues(index)

这将返回列值的不同列表
然后用逗号分割每个值,并建立一个唯一的选项列表
使用过滤器上的
选项

然后在过滤器的
'statechange'
事件上,
使用数据表方法
getFilteredRows()
查找行索引
其中包含过滤器的选定选项
使用行索引在图表上设置视图

请参阅下面的工作片段,使用了表格图表

google.charts.load('current'{
包:['controls','corechart','table']
}).然后(函数(){
var表https://docs.google.com/spreadsheets/d/1DOTezFuzpH8wzeh25Cgv9e9q577zd_HN1TiIxVQzbUQ/edit#gid=0';
var table=new google.visualization.ChartWrapper({
chartType:'表',
集装箱:“图表表”,
选项:{
allowHtml:是的
}
});
var filter=new google.visualization.ControlWrapper({
controlType:“CategoryFilter”,
集装箱ID:“过滤等级”,
选项:{
过滤柱索引:12,
matchType:'任何',
allowTyping:对,
用户界面:{
标签定位:“水平”,
标签:“”,
标题:“按年级过滤”,
selectedValuesLayout:'aside',
sortValues:错误
}
}
});
新的google.visualization.Query(sheet).send(函数(响应){
var data=response.getDataTable();
var gradeAnswers=data.getDistinctValues(12);
var=[];
评分答案。forEach(函数(答案){
如果(回答!==null){
var choices=answer.split(',');
选项。forEach(函数(选项){
choice=choice.trim();
if(gradeChoices.indexOf(choice)=-1){
等级选择。推送(选择);
}
});
}
});
gradeChoices.sort();
google.visualization.events.addListener(过滤器,'statechange',函数(){
var state=filter.getState().selectedValues;
table.setView(空);
如果(state.length>0){
table.setView({
行:data.getFilteredRows([{
专栏:12,
测试:功能(值){
var=false;
如果(值!==null){
state.forEach(函数(已选){
如果(值indexOf(选定)>-1){
发现=真;
}
});
}
发现退货;
}
}])
});
}
table.draw();
});
filter.setDataTable(数据);
filter.setOption('values',grade选项);
filter.draw();
table.setDataTable(数据);
table.draw();
});
});


您需要手动从表中的所有行填充
属性,正如您所做的那样——您还需要在
'statechange'
事件上手动解除绑定并处理筛选器谢谢您的响应,WhiteHat。我真的很感激!然而,我不知道如何进行手动过滤。我还会使用CategoryFilter吗?我创建了一个JSFIDLE,希望您能为我提供更多的指导。我将代码从改编为,不将过滤器绑定到表,而是通过查询手动过滤数据。但是,我不知道如何“组合”过滤器。例如,如果我在过滤器中选择K-2,当我单击3-5时,该过滤器将被覆盖。我需要把它们叠起来。然后,如果我为学科领域创建了一个过滤器,我需要将它们与年级水平叠加。下面是一个使用手动复选框过滤器()的JS Fiddle,@WhiteHat。过滤器工作得很好。在此配置中,我将在何处为表设置选项,例如:“视图”:(列:[0]});?这适用于初始绘制,但一旦使用过滤器,所有列都会显示。需要将
定义添加到
'statechange'
事件中的
setView
方法中,请参见编辑2…@WhiteHat-您是一个天才。非常感谢你!现在,我将尝试添加第二个过滤器,这与主题区域具有相同的功能。现在,我添加了第二个过滤器[请参见此处](}),是否有一种方法可以在不使用仪表板的情况下绑定结果。我希望这些过滤器可以一起工作,但现在它们取消了另一个之前的结果。
 var gradeLevels = ['K-2','3-5'];

   var GradeLevelCategoryFilter = new google.visualization.ControlWrapper({
      'controlType': 'CategoryFilter',
      'containerId': 'GradeLevelCategoryFilter',
      'options': {
       'filterColumnIndex': '11',
       'matchType': 'any',
       'allowTyping': true,
       'values' : gradeLevels,
       'ui': {
       'labelStacking': 'horizontal',
       'label': '',
       'caption' : 'Filter by Grade Level(s)',
       'selectedValuesLayout': 'aside',
       'sortValues' : false,
       }
      }
    });