找回密码
 立即注册

QQ登录

只需一步,快速开始

BND

高级会员

170

主题

526

帖子

1826

积分

高级会员

积分
1826
BND
高级会员   /  发表于:2022-7-14 11:50  /   查看:2982  /  回复:14
1金币
企业微信截图_16577706103384.png279313353.png

最佳答案

查看完整内容

原因是代码中的行列索引参数传反了,参考下面的代码调整即可。

14 个回复

倒序浏览
最佳答案
最佳答案
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-7-14 11:50:43
来自 15#
BND 发表于 2022-7-15 11:55
第一次点击单元格回跳回开始菜单,然后单选只能改A1B2C3对应的斜行,第一次框选改的有效果,第二次框选就 ...

原因是代码中的行列索引参数传反了,参考下面的代码调整即可。
image.png388863524.png
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-7-14 14:11:23
2#
你好,可以在execute里面拿到当前工作簿实例以及当前的选区
image.png692739867.png

通过遍历选区用sheet.getCell(i,j).locked()来判断对应的单元格锁定状态,为true则置通过sheet.getCell(i,j).locked(false)为false,为false则通过sheet.getCell(i,j).locked(true)置为true。


回复 使用道具 举报
BND
高级会员   /  发表于:2022-7-14 15:52:19
3#
本帖最后由 BND 于 2022-7-14 15:53 编辑
Derrick.Jiao 发表于 2022-7-14 14:11
你好,可以在execute里面拿到当前工作簿实例以及当前的选区

let spread = context.getWorkbook();
          let sheet = spread.getActiveSheet();

          let selections = sheet.getSelections()[0];

          console.log(selections);
          for (
            let i = selections.col;
            i < selections.colCount + selections.col;
            i++
          ) {
            for (
              let j = selections.row;
              j < selections.rowCount + selections.row;
              j++
            ) {
              if (sheet.getCell(i, j).locked()) {
                sheet.getCell(i, j).locked(false);
         
              }
              sheet.getCell(i, j).locked(true);
            }
          }为什么我这样写没有效果
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-7-14 17:41:40
4#
BND 发表于 2022-7-14 15:52
let spread = context.getWorkbook();
          let sheet = spread.getActiveSheet();

走到最后一句代码的时候已经设为false的单元格又重新变为true了。
image.png835614318.png

建议再加个else
image.png864588012.png

另外,上面的locked生效的前提是开启表单保护。
回复 使用道具 举报
BND
高级会员   /  发表于:2022-7-14 17:58:35
5#
Derrick.Jiao 发表于 2022-7-14 17:41
走到最后一句代码的时候已经设为false的单元格又重新变为true了。

我知道,我可以直接看到是否锁定,这个我也解决了确实是if else的问题,但是改完之后会只有A1一格生效,这是为什么?
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-7-14 18:19:48
6#
BND 发表于 2022-7-14 17:58
我知道,我可以直接看到是否锁定,这个我也解决了确实是if else的问题,但是改完之后会只有A1一格生效, ...

我这边测试是没问题的,这是我测试的demo。

新增ribbon和按钮.html

5.96 KB, 下载次数: 112

回复 使用道具 举报
BND
高级会员   /  发表于:2022-7-14 18:28:45
7#
Derrick.Jiao 发表于 2022-7-14 18:19
我这边测试是没问题的,这是我测试的demo。

var w = {
            "Welcome": {
                title: "Welcome",
                text: "Welcome",
                type: "checkbox",

                commandName: "Welcome",
                execute: async (context, propertyName, fontItalicChecked) => {
                    debugger
                    var spread = context.getWorkbook();
                    var sheet = spread.getActiveSheet();
                    console.log(sheet.getSelections())
                    let selections = sheet.getSelections()[0];
                    for (let i = selections.col; i < selections.colCount + selections.col; i++) {
                        for (let j = selections.row; j < selections.rowCount + selections.row; j++) {
                            if (sheet.getCell(i, j).locked()) {
                                sheet.getCell(i, j).locked(false);

                            } else {
                                sheet.getCell(i, j).locked(true);
                            }

                        }
                    }

                },
                getState: (context) => {
                    let sheet = context.Spread.getActiveSheet(); //设置 checkBox 初始状态            //return !sheet.isPrintLineVisible();    //初始为选中状态
                    // console.log(sheet);
                    // console.log(context);
                    // console.log(
                    //   sheet
                    //     .getCell(sheet.getActiveRowIndex(), sheet.getActiveColumnIndex())
                    //     .locked()
                    // );
                    return context.Spread.getActiveSheet()
                        .getCell(sheet.getActiveRowIndex(), sheet.getActiveColumnIndex())
                        .locked(); //初始为未选中状态
                },
            }
        }



改成我这样就复现问题了,这种怎么解决,只有A1能切换
回复 使用道具 举报
ann悬赏达人认证
初级会员   /  发表于:2022-7-15 09:15:49
8#
您好:因为您的execute函数中带有上下文信息context。上面的代码我们这边不好复现,我这边更新了一下代码执行结果如图所示。我理解您是想在execute中修改单元格的锁定状态,然后通过getState获取修改后的状态。尝试下在execute中将更新后的表单重新set回context对象,然后在getState函数中再获取试试呢

image.png938638610.png
image.png451040648.png
回复 使用道具 举报
ann悬赏达人认证
初级会员   /  发表于:2022-7-15 09:19:18
9#
execute函数的执行结果如上,逻辑正常。应该是更新后的内容没有回写进您的上下文对象context中。如果要完全复现问题,需要提供完整的代码哈
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部