通过JS在多个仪表板/工作表中通过JS设置Tableau过滤器



我们有一个工作簿,其中包含两个仪表板,第一个包含一个工作表,第二个包含四个工作表。

我们正在尝试通过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);

我们看到的问题是,每个仪表板上只有一个工作表正在更新。在Chrome中逐步浏览JS,我可以看到呼叫应用程序((似乎不会导致错误的预期次数,它似乎根本不想更新所有过滤器/工作表,每个仪表板上只有一个。。

想法?建议?语法错误?

getPublySheetsInfo((返回一个正在返回一个工作表的集合,一个仪表板可以通过调用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
            }
        }
    }
}

最新更新