2017-04-24 93 views
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()调用的预期次数似乎不会导致错误,但它似乎并不想更新所有过滤器/工作表,每个仪表板上只有一个。

想法?建议?语法错误?

+0

我的第一个想法是更改工作簿并将筛选器设置为“应用于所有数据源”?那么你不需要用javascript来迭代。请参阅http://onlinehelp.tableau.com/current/pro/desktop/en-us/filtering_global.html。 –

+0

感谢您的建议。不幸的是,这正是他们目前正在做的事情,但是,由于各种表单中存在多个不同的数据源,这是一件非常痛苦的事情,而且过于复杂。我应该补充说,这只是处理这些多工作表dashdboard的一个更大的机制的一小部分。 – Mike

+0

可以使用版本10中较新的过滤器功能来覆盖所有数据源?我认为这是一个名为“应用于所有使用相关数据源”的过滤器功能。 –

回答

1

getPublishedSheetsInfo()返回一个返回一个工作表和一个仪表板的集合,其中的类型可以通过调用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 
      } 
     } 
    } 
}