2017-04-24 1 views
0

우리는 두 개의 대시 보드가 포함 된 통합 문서, 첫 번째는 하나 개의 워크 시트를 포함하고 두 번째는 네 개의 워크 시트가 포함되어 있습니다.설정 타블로 필터

URL을 통해 필터를 전달하려고합니다. (해당 부분은 정상이지만) 두 번째 대시 보드의 모든 워크 시트를 업데이트 할 수 없습니다.

코드는 대시 보드를 반복하고 차례로 활성화 한 다음 각각에 대해 filterActiveSheet() 메서드를 호출합니다.

이 메서드는 각 워크 시트를 순서대로 반복하고 제공된 필드 이름과 일치하는 범주 필터를 검색하고 발견되면 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); 

문제는 각 대시 보드에서 하나의 워크 시트 만 업데이트된다는 것입니다. 내가 applyFilterAsync() 호출 오류가 발생하지 않는 것 배의 예상 수를 볼 수 있습니다 크롬에서 JS를 통해 스테핑, 단순히 각 대시 보드에서 모든 필터/워크 시트를 업데이트 할 단지를하지 않는 것 .

생각하십니까? 제안? 구문 오류?

+0

내 첫 번째 생각은 통합 문서를 변경하고 필터를 모든 데이터 원본을 사용하여 적용하는 것입니다. 그렇다면 자바 스크립트로 반복 할 필요가 없습니다. http://onlinehelp.tableau.com/current/pro/desktop/en-us/filtering_global.html을 참조하십시오. –

+0

제안 해 주셔서 감사합니다. 다양한 시트에 여러 개의 서로 다른 데이터 소스가 불행하게도 그게은 총 고통과 사물을 지나치게 복잡하게, 그들이 현재하고있는 일입니다 만. 이것은이 다중 워크 시트 대시 보드를 처리하는 훨씬 더 큰 메커니즘의 작은 부분 일 뿐이라고 덧붙여 야합니다. – 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 
      } 
     } 
    } 
}