惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
腾讯CDC
博客园 - 司徒正美
A
About on SuperTechFans
H
Help Net Security
J
Java Code Geeks
C
Check Point Blog
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MongoDB | Blog
MongoDB | Blog
U
Unit 42
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
MyScale Blog
MyScale Blog
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
F
Fortinet All Blogs
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
博客园 - 【当耐特】
雷峰网
雷峰网

程序员

V2EX 看到讨论"跨域"的帖子,那个她好像回来了 codex 今天真的是不稳定呀。 火山方舟 Coding Plan 慎买 刚问了大家 openclaw 和 hermes 在什么机器上面玩,求推荐一个机器 GPT-image-2 生成 AI 图片防伪有感 codex pro 5 小时限制已经严重缩水 逆天 Antigravity 动态 JSON 序列化对强类型语言很难吗? 自建了 GPT Coding Plan,遇到了定价问题,请教大家 大家都是在什么设备上玩 openclaw 以及 hermes 的呀? 软考还有一个月就考试了,你们学习了吗? 大伙用 AI 会考虑在 user scope 的 CLAUDE.md/AGENTS.md 里交代 AI 说中文吗 我发现程序员这个群体很大部分其实挺抠的 最近使用 cc 总会莫名其妙的返工, codex 不会 目前体验最好的远程 vibe 工具 想知道大佬们抓包遇到 ssl pinning 都是咋优雅的 解决的? 工业软件的大佬们是怎么 vibe coding 的 最近 chrome 是不是有 bug 啊,一搜索就卡住 分布式异步系统在 vibe coding 下的困境 PHP Native AOT 编译器,支持将 PHP 代码编译为可执行文件,运算性能提高 150 倍 没想到 2026 年,还要浪费大量时间在跨域问题上 DeepSeek V4 这周会出吗? 中转站正式试营 欢迎试用 不掺不假 小米 mimo 升级 v2.5,并且重置了额度 Jenkins, SCM 轮询完全不工作是啥问题啊 赛博斗蛐蛐, AI 模型的简单对比(白嫖版) 使用中转站要擦亮眼睛!不说别的,倍率计算 充值好乱。 买了火山的 Coding Plan 测试得出计费模式 给我的 AI 生成了简历和状态卡, 大家帮忙看下 Ta 能找到啥样的
我做了一个飞书多维表格/钉钉 AI 表格的简单替代品
penzi · 2026-06-22 · via 程序员

Github: https://github.com/autable/autable

主页以及文档: https://autable.github.io/

最近我在尝试把一些公司内部的流程迁移到钉钉 AI 表格, 然而发现并不顺利

  1. 钉钉审批流程同步到 AI 表格之后, 会产生多条相同编号的记录, 钉钉的表单和自动化没有任何办法处理这个问题, 因为钉钉并没有把 unique 的 record id 暴露出来
  2. 钉钉 AI 表格的 AI 非常傻, 经常做不到一些简单的表单定义和自动化流程定义
  3. nocode 的自动化对于会写代码的人完全是负生产力
  4. 最大的问题, 即使付费, 默认最高也只有单表 5 万条记录

我也调研了一下开源方案, 一个问题就是 OIDC 登录基本都是付费功能, 商业版 self-host 普遍定价比钉钉/飞书的最高级别的订阅还贵

最终, 我搓了一个符合我需求的 AI 表格

  1. 支持表格, 自动化, 表单和字段级别的权限配置
  2. 自动化, 表格都使用简单的 js 定义, AI 友好的方式
  3. 支持公式字段, 公式同样使用 js 表达
  4. 存储使用 sqlite, 运维成本低, 最初的容灾方案每天备份一次就行了
  5. 支持 OIDC, GPL 3.0 license, 永远不用担心开原版缺失关键功能

目前刚跑通一个使用案例, 可以使用自动化同步钉钉 AI 表格的数据, 已经可以渐进式迁移, 并且可以借助这个打通钉钉内部所有数据的同步

下面是一个周期性同步钉钉 AI 表格的 workflow.js 例子

function instances(info) {
  return {
    timer: "time.schedule",
    dingTable: "dingtalk.notable.records.list",
    fields: "table.field.create",
    rows: "table.row.upsert"
  };
}

function trigger(info) {
  return {
    instance: "timer",
    params: {
      interval_ms: 5 * 60 * 1000
    }
  };
}

function run(info) {
  const table = "同步表";
  let nextToken = "";

  while (true) {
    const page = info.instance("dingTable").exec({
      max_results: 100,
      ...(nextToken ? { next_token: nextToken } : {})
    });

    const records = page.records || [];

    info.instance("fields").exec({
      table,
      fields: fieldsOf(records)
    });

    for (const record of records) {
      info.instance("rows").exec({
        table,
        match_field: "dingtalk_record_id",
        values: valuesOf(record)
      });
    }

    nextToken = page.next_token || "";
    if (!page.has_more || !nextToken) break;
  }

  return { ok: true, table };
}

function fieldsOf(records) {
  const fields = {
    dingtalk_record_id: "string"
  };

  for (const record of records) {
    for (const name of Object.keys(record.fields || {})) {
      fields[name] = "string";
    }
  }

  return fields;
}

function valuesOf(record) {
  return {
    dingtalk_record_id: String(record.id || ""),
    ...Object.fromEntries(
      Object.entries(record.fields || {}).map(([name, value]) => [
        name,
        stableStringify(value)
      ])
    )
  };
}