【问题标题】:Setting tableau filters via JS across multiple dashboards/worksheets通过 JS 跨多个仪表板/工作表设置画面过滤器
【发布时间】:2017-09-20 18:17:40
【问题描述】:

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

我们正在尝试通过 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迭代了。见onlinehelp.tableau.com/current/pro/desktop/en-us/…
  • 感谢您的建议。不幸的是,这就是他们目前正在做的事情,但是由于各个工作表中有多个不同的数据源,这完全是一件痛苦的事情,而且事情过于复杂。我应该补充一点,这只是处理这些多工作表仪表板的更大机制的一小部分。
  • 能否使用版本 10 中较新的过滤器功能来帮助覆盖所有数据源?我认为这是一个名为“应用于所有使用相关数据源”的过滤器功能。
  • 就像我说的那样,这基本上就是正在做的事情,但这显然需要创建多个别名,并且只会成为维护的噩梦。一个简单的事实是 javascript 应该可以工作,但它根本就不行。这些问题现在已通过 tableau 作为错误报告提出。

标签: javascript tableau-api


【解决方案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
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多