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

QQ登录

只需一步,快速开始

pele

初级会员

22

主题

58

帖子

374

积分

初级会员

积分
374
pele
初级会员   /  发表于:2025-11-3 14:22  /   查看:85  /  回复:10
1金币
本帖最后由 Wilson.Zhang 于 2025-11-4 09:16 编辑

产品:SpreadJS
版本:15
调研编号:GCNSJS-28059
Last Review:2025-11-04
当前进展:getDirtyRows()记录最后一次变更和上一次变更之间的差异,属当前产品设计,非功能问题。

通过getDirtyRows获取当前工作表脏行集合,但行对象中的原妈数据项originalItem中有些元素变为当前单元格数据。
举例如下:
wb = GC.Spread.Sheets.findControl(document.getElementById('ss'));
ws = wb.getActiveSheet();
ds = [{"bmlb":"0002","lbmc":"testfffff4444","pxh":"21","yxbj":"1","xgbj":"1","f_id":"0002"},{"bmlb":"00031","lbmc":"testfffff","pxh":"20","yxbj":"1","xgbj":"","f_id":"00012"}]
ws.setDataSource(ds);

修改行一的bmlb和f_id通过getDirtyRows获取脏行集合,发现原始数据项originalItem的bmlb和f_id也变了


这是什么原因造成的?或者有什么办法获取原始数据?
谢谢!


附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

不客气~如果您需要在表单保护下让筛选器中的排序功能可用,需要设置allowSort为true,如下图所示: 另外,虽然是相同的数据源,但是问题现象完全不一样,所以建议您下次可以对新问题发一个新帖子,这样上下文也清晰,方便咱们一块跟进讨论。

10 个回复

Wilson.Zhang
超级版主   /  发表于:2025-11-4 09:15:28
来自 5#
您好!经调研,了解到getDirtyRows()记录的是最后一次变更和上一次变更的差异。

以您的图示来看,您应该是先后对bmlb、f_id、xgbj依次修改了数据,对应了三次修改,在前两次修改后,bmlb和f_id已经由原始数据变为了32,因此在修改xgbj数据为0后,getDirtyRows()显示的是第二次修改后和第三次修改后的差异。

参考上述,做三次修改,如下动图所示,可以看到每次修改后的getDirtyRows()结果中被修改数据的新旧值差异:


综上,如果您想要对比修改后数据与原始数据源之间的差异,getDirtyRows()不太符合您的需要,您可以参考AI技术顾问和4楼给出的数据源深拷贝的方案。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2025-11-3 14:22:42
来自 7#
本帖最后由 Wilson.Zhang 于 2025-11-7 09:08 编辑
pele 发表于 2025-11-7 08:44
谢谢回复!还是上面的数据,增加filter,工作表保护后筛选功能可用,排序无效。
wb = GC.Spread.Sheets. ...

不客气~如果您需要在表单保护下让筛选器中的排序功能可用,需要设置allowSort为true,如下图所示:


另外,虽然是相同的数据源,但是问题现象完全不一样,所以建议您下次可以对新问题发一个新帖子,这样上下文也清晰,方便咱们一块跟进讨论。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-11-3 15:33:12
2#
您好!帮您调研下这个现象先,调研编号为GCNSJS-28059,待有进展会及时向您同步。

请问下您的具体需求是修改了一个单元格后获取这个单元格的新旧值,还是获取被修改单元格所在行中各列字段组合的原始数据对象?
回复 使用道具 举报
pele
初级会员   /  发表于:2025-11-3 16:31:07
3#
Wilson.Zhang 发表于 2025-11-3 15:33
您好!帮您调研下这个现象先,调研编号为GCNSJS-28059,待有进展会及时向您同步。

请问下您的具体需求是 ...

当前工作表数据有变化时,能通过getDirtyRows获取已修改数据的最原始数据及修改后的数据。
按API文档说明:row.item 指定当前行的数据项(已修改),row.originalItem 指定行的原始数据项(最原始:不包括修改后的数据。setDataSource()后的数据)
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-11-3 17:39:32
4#
pele 发表于 2025-11-3 16:31
当前工作表数据有变化时,能通过getDirtyRows获取已修改数据的最原始数据及修改后的数据。
按API文档说 ...

这样的话,那就在设置数据源之前,对数据源对象进行深拷贝保存一个备份数据;修改了单元格数据后通过getDirtyRows()了解具体是哪行,根据行索引对标数据源备份数据中的相同索引处的数据对象,也可以同时了解修改前后的各属性。
回复 使用道具 举报
pele
初级会员   /  发表于:5 天前
6#
Wilson.Zhang 发表于 2025-11-4 09:15
您好!经调研,了解到getDirtyRows()记录的是最后一次变更和上一次变更的差异。

以您的图示来看,您应该 ...

谢谢回复!还是上面的数据,增加filter,工作表保护后筛选功能可用,排序无效。
wb = GC.Spread.Sheets.findControl(document.getElementById('ss'));
ws = wb.getActiveSheet();
ds = [{"bmlb":"0002","lbmc":"testfffff4444","pxh":"21","yxbj":"1","xgbj":"1","f_id":"0002"},{"bmlb":"00031","lbmc":"testfffff","pxh":"20","yxbj":"1","xgbj":"","f_id":"00012"}]
ws.setDataSource(ds);
range = new GC.Spread.Sheets.Range(-1, 0, -1, ws.getColumnCount());
rowFilter = new GC.Spread.Sheets.Filter.HideRowFilter(range);
ws.rowFilter(rowFilter);
ws.options.protectionOptions.allowFilter = true;
ws.options.isProtected = true;
取消保护后(ws.options.isProtected = false;)排序功能可用。这是什么原因?
回复 使用道具 举报
pele
初级会员   /  发表于:5 天前
8#
Wilson.Zhang 发表于 2025-11-7 09:01
不客气~如果您需要在表单保护下让筛选器中的排序功能可用,需要设置allowSort为true,如下图所示:

谢谢!下次注意!
不过我用的版本是15.2.5,工作表的protectionOptions属性里只有allowFilter,没有您写的allowSort.
回复 使用道具 举报
pele
初级会员   /  发表于:5 天前
9#
Wilson.Zhang 发表于 2025-11-7 09:01
不客气~如果您需要在表单保护下让筛选器中的排序功能可用,需要设置allowSort为true,如下图所示:

不好意思,ws.options.protectionOptions.allowSort = true这么设置后好用了。谢谢!
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:5 天前
10#
您好,您提出的问题应该已经解释清楚了,这边就先结贴了,有问题可以发新帖~
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部