Grist 完整指南:一条命令跑起来的关系型电子表格
【免费下载链接】grist-coreGrist is the evolution of spreadsheets.项目地址: https://gitcode.com/GitHub_Trending/gr/grist-core
周五傍晚,同事发来一份 3000 行的 Excel:两列长得几乎一样的名字,一列里日期和文本混着写,跨表核对全靠手抄。打开 Grist 这个开源的关系型电子表格,你可以用数据库的方式接住这类数据:每一列都有名字和类型,表与表之间用引用关联,公式改动后自动重算。Grist 把电子表格的易上手和数据库的结构约束放在同一个单文件文档里。
先弄清它是什么:表格里套了一台数据库
Grist 官方对自己的定义是 "a modern relational spreadsheet"——把电子表格的灵活和数据库的严谨合在一起。和 Excel 最大的区别在两处:
- 列像数据库字段:一列只装一种数据,有名字、有类型(日期、货币、附件、引用、选择列表等);
- 单元格可以写公式:公式列在引用变化时自动更新,和电子表格一样实时。
所以它同时具备两边的长处:像表一样直接敲键盘录入,像库一样保证结构不乱。
Grist 的计算和存储是分离的,单个文档的工作机制:
两个设计细节值得记住:公式用Python写(标准库可用,也内置了一批 Excel 风格函数);文档格式.grist底层就是SQLite,任何 SQLite 工具都能直接读里面的数据。这意味着备份、归档、迁移到别的服务器,本质上就是拷一个文件。
一条命令部署,五分钟建出第一个看板
装 Docker 后,一条命令即可启动:
docker run -p 8484:8484 -v $PWD/persist:/persist -it gristlabs/grist文档存在挂载进容器的/persist目录里。浏览器打开http://localhost:8484,首次启动会进入 Quick setup 页面,让你选管理员邮箱和登录方式;启动密钥(boot key)打印在容器日志里,用于登录/admin管理面板。个人使用图省事可以设GRIST_DEFAULT_EMAIL,点登录就自动以这个身份进入。生产环境建议加上三个开关:
docker run -p 8484:8484 -v $PWD/persist:/persist \ -e GRIST_SANDBOX_FLAVOR=gvisor \ -e GRIST_FORCE_LOGIN=true \ -e GRIST_MAX_PARALLEL_REQUESTS_PER_DOC=20 \ -it gristlabs/gristGRIST_SANDBOX_FLAVOR=gvisor:Linux 上把文档里的 Python 代码关进 gVisor 沙箱执行,防不受信任的公式代码;macOS 用macSandboxExec,跨平台兜底方案是pyodide;GRIST_FORCE_LOGIN=true:关掉匿名访问,所有文档必须先登录;GRIST_MAX_PARALLEL_REQUESTS_PER_DOC:限制单个文档的并发 API 请求数,默认 10。
上图是 Grist 官方文档里的多服务器部署形态:负载均衡把浏览器请求分给 Home Server(管用户、组织)和 Doc Worker(每个文档独立开一个),文档数据落盘 SQLite,快照存到 S3 兼容对象存储,Redis 缓存会话和查询。单条 Docker 命令只是把这套架构缩到了一台机器上。
接下来按四步建第一个文档:
- 新建空白文档,把默认表重命名,比如
Tasks; - 点列头右侧的加号加列,选类型:
Status选 Choice List(可给每个选项配颜色标签),Due选 Date,Hours选 Number; - 新建第二张表
Projects,回到Tasks加一列类型选 Reference,指向Projects——之后填表时下拉选项目,关系不用再手工维护; - 左侧页签新建一页,从页面部件里拖出 Summary 表(按 Status 计数)和 Card 视图(按 Due 分组),点击图表里的某个分组,其他部件联动筛选。
所有视图共享同一份数据,不复制、不会各看各的。左侧工具栏里还有 Access Rules、Raw Data、Document History 等入口,后面会用到。
用它解决两个真实问题
公式列算库存,告别手工盘点
痛点:SKU 表里"当前库存"靠人工维护,出入库流水记在另一张表,想知道哪个货要补货,每周得手工对一遍。
Grist 的落地方式:两张表 + 两个公式列。Inventory表放Sku、MinStock;Movements表放Sku、Date、Qty(入库为正、出库为负)。在Inventory里加公式列Available:
total = 0 for r in doc.Movements: if r.Sku == $Sku: total += r.Qty return $BaseStock + total再加分组筛选(按Sku过滤),每行的Available就自动算出该 SKU 的实时库存;MinStock一改,整列立刻重算。接着加一列布尔公式Low = $Available < $MinStock,再给这列套条件格式,低于安全库存的行自动标红。
顺带一提:Grist 把每次单元格修改都记在内置的 ActionLog 表里,谁在什么时间改了什么,回看文档历史即可,不用自己写审计代码。
引用关系拼出客户 360° 视图
痛点:销售看一个客户要开三个窗口——客户表、订单表、沟通记录,来回切换拼上下文。
落地方式:建Customers、Orders、Notes三张表;Orders.Customer建为指向Customers的引用列,勾选双向引用(two-way reference),两边自动同步。客户表里加两个公式列:
sum(r.Amount for r in doc.Orders if r.Customer_id == $__system_id)max(r.Date for r in doc.Notes if r.Customer_id == $__system_id)第一列算客户累计订单额,第二列算最近一次跟进日期。最后做一页 Card 视图,按最近跟进日期排序——谁该跟进、谁贡献大,一屏看完。这就是关系型表格的核心收益:数据只存一份,视角随便拼。
选 Grist 还是别的工具
| 维度 | Grist | Excel / Google Sheets | Airtable | PostgreSQL |
|---|---|---|---|---|
| 数据结构 | 类型化列 + 表间引用 | 无约束,靠自觉 | 类型化列 + 引用 | 完整关系模型 |
| 公式 | Python 标准库 + Excel 风格函数 | 各有一大套函数 | 基础函数 | 需 SQL |
| 行级权限 | 行/列/表三级规则 | 无 | 工作区级 | 应用层自理 |
| 自托管 | 单文件即可跑 | 桌面/云端 | 不支持 | 可以 |
| 许可 | Apache 2.0 | 订阅制 | 订阅制 | 开源 |
选型一句话:如果你想要数据库的约束但不想维护独立后端,且团队会写一点点 Python,Grist 是这几类工具里少见的"一个文件全都有"的方案。
运维上只记三条:
- 认证:多人使用或暴露到公网前,先配好登录;
GRIST_DEFAULT_EMAIL只适合单机自用,生产环境应关掉并接入统一身份源; - 沙箱:文档里的 Python 公式默认跑在服务进程环境里,对外部来源的文档务必开启沙箱(见上面部署命令);
- 性能:
GRIST_ACTION_HISTORY_MAX_ROWS(默认 1000)控制动作历史长度,多文档集群用REDIS_URL接 Redis 缓存会话与查询。完整变量表见仓库根目录的 README.md,Python 引擎源码在 sandbox/grist/。
你可能想问的三个问题
为什么首次启动要输一个密钥?全新部署会进入 Quick setup 引导你设置管理员邮箱与登录方式,boot key 打印在容器日志里,也是登录/admin管理面板的凭证。如果只想快速试用、跳过引导,设GRIST_IN_SERVICE=true即可。
现有数据怎么搬进来?文档直接导入 CSV 和 Excel 文件,也支持从 Airtable 拉取;再导入同一份 CSV 时做增量合并,只更新或新增记录,不产生重复行。
开源协议和付费版是什么关系?这个仓库grist-core是 Apache 2.0 开源的,上面提到的功能全部包含在内;Grist Labs 另外提供带高级 SSO、自动化、审计日志等功能的完整版,年融资额 100 万美元以下的小型组织可免费启用。
继续往下走
- 官方文档(自托管指南、公式参考):documentation/
- 部署示例(Postgres + Redis + MinIO):docker-compose-examples/grist-with-postgres-redis-minio/
- 模板库 templates.getgrist.com、社区论坛 community.getgrist.com
- 项目由 Grist Labs(纽约)开发,法国政府数字部门参与了大量贡献,
grist-core、grist-desktop、grist-static三个仓库均为 Apache 2.0 协议。
【免费下载链接】grist-coreGrist is the evolution of spreadsheets.项目地址: https://gitcode.com/GitHub_Trending/gr/grist-core
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考