请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

zhengxiang

初级会员

5

主题

19

帖子

253

积分

初级会员

积分
253
最新发帖

[已处理] 校验

zhengxiang
初级会员   /  发表于:2018-10-11 16:26  /   查看:7319  /  回复:11
1.同一个单元格可以设置两个校验方式吗?比如一个单元格既不能为负数,也不能超过同一行的某个单元格的数值。 blob286654967.png
代码://设置校验function setColNumValidator(spread, formatterArray) {
    var sheetObj = spread.getActiveSheet();
    sheetObj.suspendPaint();
    var numValidator = new spreadNS.DataValidation.createNumberValidator(6, 0, 100000000000000, false);
    numValidator.inputTitle("输入范围:0-100000000000000");
    numValidator.inputMessage("得分不能大于标准分");
    var rowCount = sheetObj.getRowCount();
    for (var i = 0; i < formatterArray.length; i++) {
        if (formatterArray == "0.00") { //设置只能输入【0-100000000000000】的数字           
            sheetObj.setDataValidator(headerRowCount, i, rowCount - headerRowCount, 1, numValidator);
        }
    }
    //设置得分不能大于标准分  (以下代码有问题)
    for (var i = 1; i <= rowCount; i++) {
        var bzf = sheet.getCell(i, 2).value() == null ? 0 : sheet.getCell(i, 2).value(); //标准分
        var df = sheet.getCell(i, 4).value() == null ? 0 : sheet.getCell(i, 4).value(); //得分
        if (df > bzf) {//得分大于标准分
            sheetObj.setDataValidator(headerRowCount, 4, rowCount - headerRowCount, 1, null);
        }
    }

    sheetObj.resumePaint();
}

我设置了得分不能大于标准分之后,输入负数的校验也不管用了。。。请教各位大神了




11 个回复

倒序浏览
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-11 16:53:38
沙发
您好,您这是个多重校验的问题,Spread JS原生不支持多个Validator作用在同一个单元格的

我给您贴一个简单的Demo,应该可以解决您的问题,您先参考一下。

MultiValidator.html

3.04 KB, 下载次数: 282

回复 使用道具 举报
zhengxiang
初级会员   /  发表于:2018-10-12 14:22:13
板凳
blob160065001.png
//设置单元格停止编辑时的校验
function setValidatorAfterEdit(spread, e, info) {
    var row = info.row;
    var validators = [];
    var sheetObj = spread.getActiveSheet();
    var rowCount = sheet.getRowCount();
    validators = [{
        validator: "E" + row + ">B" + row,
        error_message: "error_1: 得分应小于标准分!"
    }, {
        validator: "E" + row + "<0",
        error_message: "error_1: 得分不能为负数!"
    }];
    var cell = sheetObj.getCell(row, 4);
    validators.some(function (obj) {
        var tmpValidator = new GC.Spread.Sheets.DataValidation.createFormulaValidator(obj.validator);
        tmpValidator.errorTitle("error");
        tmpValidator.errorMessage(obj.error_message);
        tmpValidator.ignoreBlank(false);
        sheetObj.setDataValidator(row, 4, tmpValidator);
        var vad = sheetObj.getDataValidator(row, 4);
        if (vad.isValid(sheetObj, row, 4, parseInt(cell.value()))) {
            //cell.backColor("green");
        } else {
            //cell.backColor("red");
            // alert("error:" + obj.error_message);
            return true;
        }
        sheetObj.setDataValidator(row, 4, null);
    });
}


能再帮我看一下吗,我根据你发的demo设置了一下,发现在  vad.isValid(sheetObj, row, 4, parseInt(cell.value()))   这个一直是false。我应该咋整


回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-12 15:36:46
地板
我看了一下,你的需求是在分数这一栏应该输入非负整数对吧,

但为什么条件中判断的是 "E" + row + "<0" ?

小于0?当输入正数或0时,当然返回false啦~
回复 使用道具 举报
zhengxiang
初级会员   /  发表于:2018-10-12 17:07:14
5#
您能帮我看下得分不能大于同一行的标准分怎么设置吗?  我只留了得分不能大于标准分的校验,试了好多遍也没生效。

{
        validator: "E" + row + "<0",
        error_message: "error_1: 得分不能为负数!"
    }
这个我以为是要满足(E+row<0)的时候提示那个提示。

对了,我的提示信息也没有出来。我运行你的demo提示是有的
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-15 10:15:47
6#
这样吧,您把您有问题的代码整个上传上来,我这边帮您排查一下。
回复 使用道具 举报
zhengxiang
初级会员   /  发表于:2018-10-15 14:05:16
7#
//设置单元格停止编辑时的校验
function setValidatorAfterEdit(spread, e, info) {
    var row = info.row;
    var validators = [];
    var sheetObj = spread.getActiveSheet();
    var rowCount = sheet.getRowCount();
    validators = [{
        validator: "E" + row + ">B" + row,
        error_message: "error_1: 得分应小于标准分!"
    }];
    var cell = sheetObj.getCell(row, 4);
    validators.some(function (obj) {
        var tmpValidator = new GC.Spread.Sheets.DataValidation.createFormulaValidator(obj.validator);
        tmpValidator.errorTitle("error");
        tmpValidator.errorMessage(obj.error_message);
        tmpValidator.ignoreBlank(false);
        sheetObj.setDataValidator(row, 4, tmpValidator);
        var vad = sheetObj.getDataValidator(row, 4);
        if (vad.isValid(sheetObj, row, 4, parseInt(cell.value()))) {
            //cell.backColor("green");
        } else {
            //cell.backColor("red");
            // alert("error:" + obj.error_message);
            return true;
        }
        sheetObj.setDataValidator(row, 4, null);
    });
}


就是这段代码,我想要的效果就是  每一行的得分不能大于该行的标准分。
还有errorTitle和errorMassage,是什么时候有提示?我加上没有效果,demo里我也没看到errorTitle和errorMassage的提示。demo运行我只看到了alert的弹框提示

我的版本是11.0.0
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-15 17:08:08
8#
业务逻辑这边我帮你实现了一下,见Demo:

MultiValidator2.html

12.33 KB, 下载次数: 220

评分

参与人数 1满意度 +5 收起 理由
zhengxiang + 5 赞一个!

查看全部评分

回复 使用道具 举报
zhengxiang
初级会员   /  发表于:2018-10-18 15:08:31
9#
谢谢,这个Demo解决了我的问题。。。就是我没有见到errorTitle和errorMessage的提示效果。是我的版本的问题吗,我的版本是11.0.0
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-19 15:43:11
10#
您好,我这边验证了一下,确实存在您说的这个问题。

造成这个问题的原因是,在设置validator后没有来得及触发validator的error事件。

我这边把Demo改了一下,这次应该可以满足您的需求了。

抱歉回复比较慢,这两天公司有年会。

MultiValidator2.html

12.33 KB, 下载次数: 260

评分

参与人数 1满意度 +5 收起 理由
zhengxiang + 5

查看全部评分

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部