页面树结构
转至元数据结尾
转至元数据起始

该宏示例在 V10.5上 验证通过

提示:本文档的示例代码仅适用于本文档中的示例报表/场景。若实际报表/场景与示例代码无法完全适配(如使用功能不一致,或多个宏代码冲突等),需根据实际需求开发代码。


示例说明

我们对电子表格报表设置跳转规则时,有时会遇到如下需求:要求根据当前用户所属角色不同,跳转到不同的目标报表。或者是根据用户所属机构不同,跳转到不同的目标报表,类似上述需求,可以参照如下方法设置。

示例资源效果如下:


设置方法

1、首先在电子表格设计器(Microsoft Office Excel)中,创建电子表格报表,源报表和目标报表。

2、在浏览器的“分析展现”节点下,选中电子表格,右键选择 编辑宏 进入报表宏界面

3、在报表宏界面新建跳转规则向导。设置向导,让其自动生成服务端模块和客户端模块代码,然后手动修改其生成的“客户端模块”代码,参考如下的示例代码,修改其中的 main 方法。

宏类型

类型

对象

事件

ClientSide

spreadsheetReport

onLinkClick

宏代码

function paramToString(v) {
    return v == null ? null: v.toString();
};
 
function main(spreadsheetReport, ruleName, params) {
    //debugger;
    if (ruleName != "跳转") return;
    // 判断当前用户所属角色,跳转到不同的报表
    if (currentUserHasRole("角色1")) {
        jump_role1(spreadsheetReport, ruleName, params);
    } else if (currentUserHasRole("角色2")) {
        jump_role2(spreadsheetReport, ruleName, params);
    } else {
        alert("当前用户不能跳转到任何报表!");
    }
};
 
// 如果当前用户拥有角色1,则跳转到报表1
function jump_role1(spreadsheetReport, ruleName, params) {
    var paramsInfo = [];
    paramsInfo.push({
        name: "五级分类",
        value: paramToString(params[0]),
        displayValue: paramToString(params[0])
    });
        if (window.bof_offline_xhr) {
        var command = spreadsheetReport.command;
        command.close();
        command.execute('OPENWITHNOREFRESH', 'I8a8af0a6017297949794e7480172984b844c0c28');
        var report = command.spreadsheetReport;
        if (paramsInfo.length > 0) report.setParamsInfo(paramsInfo);
        report.doRefresh();
    } else {
        var topWinJsLoader = window.jsloader;
        try {
            if (window.top.jsloader) {
                topWinJsLoader = window.top.jsloader;
            }
        } catch (e) {}
        var openner = domutils.isMobile() ? window.jsloader.resolve("bof.macro.views.Openner") : topWinJsLoader.resolve("bof.macro.views.Openner");
        openner.openInTab("I8a8af0a6017297949794e7480172984b844c0c28", paramsInfo);
    }
};
 
// 如果当前用户拥有角色2,则跳转到报表2
function jump_role2(spreadsheetReport, ruleName, params) {
    var paramsInfo = [];
    paramsInfo.push({
        name: "五级分类",
        value: paramToString(params[0]),
        displayValue: paramToString(params[0])
    });
    if (window.bof_offline_xhr) {
        var command = spreadsheetReport.command;
        command.close();
        command.execute('OPENWITHNOREFRESH', 'I8a8af0a6017297949794e7480172984bb8870c34');
        var report = command.spreadsheetReport;
        if (paramsInfo.length > 0) report.setParamsInfo(paramsInfo);
        report.doRefresh();
    } else {
        var topWinJsLoader = window.jsloader;
        try {
            if (window.top.jsloader) {
                topWinJsLoader = window.top.jsloader;
            }
        } catch (e) {}
        var openner = domutils.isMobile() ? window.jsloader.resolve("bof.macro.views.Openner") : topWinJsLoader.resolve("bof.macro.views.Openner");
        openner.openInTab("I8a8af0a6017297949794e7480172984bb8870c34", paramsInfo);
    }
};
 
//判断当前用户是否拥有某角色
function currentUserHasRole(roleName) {
    //debugger;
    var UserService = imports("bof.usermanager.UserService").getInstance();
    var userId = UserService.getCurrentUser().id;
    if (UserService.isAdmin(userId)) { // 如果是管理员则不判断角色
        return true;
    }
    // 获取角色ID值
    var role = UserService.getRoleByName(roleName);
    if (!role || !role.id) {
        return false;
    }
    var retVal = UserService.hasRoleByUserId(userId, role.id);
    return retVal;
};

关键对象总结

  • 判断当前用户是否拥有某角色:function currentUserHasRole(roleName)。
  • 跳转到目标报表:function jump_role2(spreadsheetReport, ruleName, params)。


资源下载

资源:migrate.xml