Javascript 通过JS跨多个仪表板/工作表设置tableau过滤器
我们有一个包含两个仪表板的工作簿,第一个仪表板包含一个工作表,第二个仪表板包含四个工作表 我们正试图通过url传递过滤器(这部分没问题),但我们无法更新第二个仪表板上的所有工作表 代码在仪表板中循环,依次激活每个仪表板,然后对每个仪表板调用filterActiveSheet()方法 此方法依次遍历每个工作表,搜索与提供的字段名相同的匹配类别筛选器,找到后,使用applyFilterAsync()方法将其替换为提供的字段名Javascript 通过JS跨多个仪表板/工作表设置tableau过滤器,javascript,tableau-api,Javascript,Tableau Api,我们有一个包含两个仪表板的工作簿,第一个仪表板包含一个工作表,第二个仪表板包含四个工作表 我们正试图通过url传递过滤器(这部分没问题),但我们无法更新第二个仪表板上的所有工作表 代码在仪表板中循环,依次激活每个仪表板,然后对每个仪表板调用filterActiveSheet()方法 此方法依次遍历每个工作表,搜索与提供的字段名相同的匹配类别筛选器,找到后,使用applyFilterAsync()方法将其替换为提供的字段名 var options = { < snip >
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);
var选项={
onFirstInteractive:函数(){
工作簿=即getWorkbook();
sheets=工作簿.getPublishedSheetInfo();
对于(s=0;s
}
}
}
});
}
}
var viz=新的tableauSoftware.viz(占位符div、url、选项);
我们看到的问题是,每个仪表板上只有一个工作表正在更新。通过Chrome中的JS,我可以看到对applyFilterAsync()的调用预期次数,这似乎不会导致错误,它只是不想更新所有过滤器/工作表,每个仪表板上只有一个
想法?建议?语法错误?GetPublishedSheetInfo()返回一个集合,该集合返回一个工作表和一个仪表板,其类型可以通过调用getSheetType()来确定。不能将getFilterAsync()直接应用于仪表板,但必须进行迭代。尝试以下方法:
if (sheet.getSheetType() === 'WORKSHEET') {
sheet.getFiltersAsync().then(function(filters) {
for (var x = 0; x < filters.length; x++) {
// do something
}
})
} else {
// either in a dashboard or story
var workSheetArray = sheet.getWorksheets();
for (var i = 0; i < workSheetArray.length; i++) {
workSheetArray[i].getFiltersAsync().then(function(filters) {
for (var x = 0; x < filters.length; x++) {
// do something
}
}
}
}
if(sheet.getSheetType()=“工作表”){
sheet.GetFilterAsync().then(函数(过滤器){
对于(var x=0;x
我的第一个想法是更改工作簿,并将筛选器设置为Apply to All Using Data Source?这样您就不需要使用javascript进行迭代。请参阅。感谢您的建议。不幸的是,这正是他们目前正在做的事情,但是,由于在不同的工作表中有多个不同的数据源,这是一件非常痛苦的事情事情很复杂。我应该补充一点,这只是处理这些多工作表Dashdboard的更大机制的一小部分。在版本10中使用更新的筛选功能是否有助于覆盖所有数据源?我认为这是一个名为“应用于所有使用相关数据源的人”的筛选功能.就像我说的,这基本上就是正在做的事情,但这显然需要创建多个别名,这会成为维护的噩梦。简单的事实是javascript应该可以工作,但它根本不能工作。现在,tableau作为错误报告提出了问题。