0
我们有一个工作簿,其中包含两个仪表板,第一个包含一个工作表,第二个包含四个工作表。跨多个仪表板/工作表通过JS设置画面过滤器
我们正在尝试通过url传递过滤器(该部分没问题),但是我们无法获取第二个仪表板上的所有工作表以进行更新。
代码循环显示仪表板,依次激活每个仪表板,然后分别调用filterActiveSheet()方法。
该方法依次遍历每个工作表,搜索匹配的具有与提供的FieldName相同的类别过滤器,并在找到时使用applyFilterAsync()方法将其替换为提供的过滤器。
var options = {
<snip>
onFirstInteractive: function() {
workbook = viz.getWorkbook();
sheets = workbook.getPublishedSheetsInfo();
for(s = 0; s < sheets.length; s++)
{
viz.getWorkbook().activateSheetAsync(s)
.then(filterActiveSheet);
}
}
};
function filterActiveSheet(sheet) {
for (ws = 0; ws < sheet.getWorksheets().length; ws++) {
var worksheet = sheet.getWorksheets()[ws];
worksheet.getFiltersAsync()
.then(function(p) {
var f = filters.split(';');
for(y=0;y<f.length;y++){
var filter = f[y].split(':');
var filterType = $.grep(p, function(e){ return e.getFieldName() == filter[0]; });
if (filterType.length > 0) {
switch(filterType[0].getFilterType()) {
case tableau.FilterType.CATEGORICAL:
return worksheet.applyFilterAsync(filter[0], filter[1], tableau.FilterUpdateType.REPLACE);
break;
<snip>
}
}
}
});
}
}
var viz = new tableauSoftware.Viz(placeholderDiv, url, options);
我们看到的问题是每个仪表板上只有一个工作表正在更新。在Chrome浏览器中浏览JS我可以看到applyFilterAsync()调用的预期次数似乎不会导致错误,但它似乎并不想更新所有过滤器/工作表,每个仪表板上只有一个。
想法?建议?语法错误?
我的第一个想法是更改工作簿并将筛选器设置为“应用于所有数据源”?那么你不需要用javascript来迭代。请参阅http://onlinehelp.tableau.com/current/pro/desktop/en-us/filtering_global.html。 –
感谢您的建议。不幸的是,这正是他们目前正在做的事情,但是,由于各种表单中存在多个不同的数据源,这是一件非常痛苦的事情,而且过于复杂。我应该补充说,这只是处理这些多工作表dashdboard的一个更大的机制的一小部分。 – Mike
可以使用版本10中较新的过滤器功能来覆盖所有数据源?我认为这是一个名为“应用于所有使用相关数据源”的过滤器功能。 –