报销单发回业务部门,表格已经锁住,公式和合计不让动。同事想给一行备注加粗,或者右键插一行写说明,却发现加粗按钮是灰的,右键菜单也只剩几项。他跑来问,是不是系统坏了。

这类表单可以用 SpreadJS Designer 搭建,这个 JavaScript 电子表格控件把 Excel 的工具栏和右键菜单一起带进页面。表单保护一开,Designer 会把大量命令置灰。默认行为本身合理,只是有时收得过头。

表单一锁,整排按钮跟着灰

sheet.options.isProtected = true 执行后,单元格进入只读状态。Designer 的工具栏按钮和右键菜单项大多绑定在命令上,命令会根据自己的上下文判断能不能用。表单被保护,上下文不满足,按钮就灰了。对财务表、审批单来说,这是安全默认值,能挡住误改公式和结构。

麻烦在于,样式和插入说明常常和改数据挤在同一排菜单里。用户需要的加粗、底色、插入行,也跟着灰了。

被误伤的是填表和标注的人

表单保护容易被当成一个总开关,打开就全锁。实际填表的人要做的事不少,填数之外还要标重点、区分状态、补一句说明。动作全禁掉,用户会导出 Excel 改完再传回来,版本就容易乱。

开发者也有难处。SpreadJS 的保护选项可以逐项放开,可一旦放开设置单元格格式,整类操作都开了。范围又太大。这个 demo 走另一条路,不碰保护选项,只给三个命令换一个可用条件。

给命令挂一个可用条件的键

Designer 的命令对象带一个 enableContext 属性,值是一段表达式。写成 enableUse 这样的键名,命令可用与否就改看 Designer 里的同名数据,不再只看表单保护。

代码先复制一份 GC.Spread.Sheets.Designer.DefaultConfig,从 CommandNames 里挑出 FontWeight、BackColor、InsertDialog,把三者的 enableContext 都设为 enableUse,再注册进 config.commandMap。三个命令共用一个开关,工具栏的加粗、背景色填充和右键插入会一起恢复。

const config = JSON.parse(JSON.stringify(GC.Spread.Sheets.Designer.DefaultConfig))
const ENABLEUSE = 'enableUse'
const D = GC.Spread.Sheets.Designer

D.getCommand(D.CommandNames.FontWeight).enableContext = ENABLEUSE
D.getCommand(D.CommandNames.BackColor).enableContext = ENABLEUSE
D.getCommand(D.CommandNames.InsertDialog).enableContext = ENABLEUSE

config.commandMap = {
  [D.CommandNames.FontWeight]: D.getCommand(D.CommandNames.FontWeight),
  [D.CommandNames.BackColor]: D.getCommand(D.CommandNames.BackColor),
  [D.CommandNames.InsertDialog]: D.getCommand(D.CommandNames.InsertDialog),
}

const designer = new D.Designer('designer-container', config)
designer.setData(ENABLEUSE, true)
designer.refresh()
designer.getWorkbook().getActiveSheet().options.isProtected = true

getCommand 返回的是命令对象本身,改完属性要放回 commandMap,Designer 初始化时才会采用这份改过的命令。setData 把 enableUse 写成 true,refresh 让界面重新计算命令状态,最后才执行 isProtected = true。

按钮亮了,单元格仍然锁着

这一点要分清楚。命令可用,表示用户点得到按钮、命令能执行。单元格能不能改,仍由表单保护和它的保护选项决定。demo 放行的是入口,锁定的单元格不会因为按钮变亮就变成可编辑。

如果业务里这个开关要跟着角色走,改完 setData 后同样补一次 refresh。上线前把允许的操作在保护状态下实际点一遍,确认它真的落到表格上,而不只是按钮恢复了颜色。

哪些表适合留一条白名单

审批单、报价单、绩效填报表都合适。数据口径固定,填表人只需要补说明和做视觉标记。把 FontWeight、BackColor、InsertDialog 这类低风险命令放进白名单,既保留标注能力,也不放开删除行、改公式。

demo 里的命令名都取自 CommandNames,能挑的很多,别把看起来方便当成理由。删除行、插入列即使按钮可用,也要先看保护选项是否允许,以及误操作后能不能恢复。白名单是给用户的例外,例外越少越好维护。

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。

更多推荐