article_image

填写表单,耗时费力,却让人不敢懈怠。

愿意动点心思之人,或延续 Microsoft Word 的传统思路,借邮件模板功能明修栈道;或取道 Pages,通过文稿合并工具暗渡陈仓。可惜我的工作不是群发邮件,相信多数读者面对的表单也不会那么简单。真实世界中的表单往往复杂许多,我从收到一份委托到完成工作,根据阶段不同,要填三五份表单,其中大部分数据通用但又不完全相同,无法直接套模板。1

法官 Janner Chang 曾写过一篇用 AppleScript 快速填充 Word 内容的文章,其半自动操作直接启发了本文。重新审视工作流程后,我摸索出新的表单填写思路:准备数据和填表分开,在表格软件中处理好原始数据,随后用自动化工具一键填充进 Word。2两步单独拿出来讲都太空泛,唯有放在一个工作流中分享,才见功效,才反映真实的职场工作。

Alt text
将案件信息填充到表格中

>>Keyboard Maestro 自动化动作下载<<

分析问题

填写表单之所以麻烦,在于你始终有两个负担:找到要在哪些地方填写信息,同时还要想好填写什么内容。在“Where”加“What”两座大山的压力下,填错表格简直是天经地义——用设计心理学的话说,这已经不是人为失误,而是表单这玩意儿本身的结构错误。

下图中的表单空白处大大小小,像日式便当盒一样让人生畏。我自己也填错过表单,不是弄错位置,就是写错内容,很尴尬。而各个流程所用的表单又很相像,进一步加剧了错误率,如果你尝试过在两个复杂的表单之间复制粘贴,大概事后都会怀疑人生:我什么要填这些鬼东西?

对于上述问题,我简化表单填写的第一步就是剥离位置属性,先把要填的内容写在单独的文件里,只关心内容,先不管要填进哪个小方块;第二步才是把整理好的数据填进 Word 表单,一个萝卜一个坑,交给自动化工具瞄准,不费人力。

整理表单数据

整理表单数据需要瞻前顾后。瞻前者,用好单元格(cell)引用功能,重复的数据——比如当事人信息——只输入一次,之后就靠引用,免去手动重复填写的同时,也从根源上消灭笔误。传话游戏大家估计都玩过,传到后来的消息已经面目全非,填表也是这样,手工操作越少,越不容易出错。

顾后者,则是把数据排为后续填充到表单中的顺序。在技术上,这其实并非必须,因为后一节所用的自动化方法其实不在乎顺序;但大体上从上到下、从左到右排列,至少不会给自己找麻烦。

在同一份委托中,我常用的几份表单包括收案审查表、归档表、质量跟踪调查表和结案登记表,它们之间有相当一部分信息是重叠的,正好可以用 Numbers 的函数简化数据。首先是表单内部的简化,比如案情简介这一项,其中的当事人信息和案由都是之前已经填过的,完全可以用函数直接生成:

PLAINTEXT("根据"&C4&"的委托,在"&C4&"与"&C7&C9&"一案中,担任"&C4&"的代理人。")

上面这段函数中,C4C7C9 都是单元格的座标,表示引用其中的数据;& 是拼接符号,要拼接的文本则需要用英文直接双引号 ""包裹起来。3最后,用一个大的 PLAINTEXT() 函数把所有内容包裹起来,以示我们需要的只是纯文本。融合引用技术和简单的函数,就可以避免反复输入,而且一旦需要修改,也只用改第一处——这正是那些时髦软件喜欢说的“一次修改,处处改动”。

Alt text
表格内部引用,降低输入量

其次,表单(sheet)之间也可以引用。各个阶段的表单多有重合之处,同样可以借引用功能简化输入、减少错误。所常用的几个表单中,只有第一份收案材料需要手动填写,后续的表单基本只是排列重组,最多补充一下后续阶段出现的新信息,比如在结案登记表中写一下判决结果。为避免遗忘,你可以把需要手动填写的那几格标成先醒目的颜色。

Alt text
表格之间引用,降低输入量

一键自动填充

整理好待填充的数据后,可以开始考虑自动填充。Janner Chang 的思路是在 Word 文档中预先设置一些关键词,填充时将其替换掉即可。此方法虽然轻巧,却挑得动千金,试想你有十几二十个空要填,也只需要预先填好 k01k02k03 等等一系列关键字,然后替换它们。4自动替换还可以保持原有的字体样式,比如加粗、斜体以及颜色等,只要表格模板本身做得讲究,就不担心格式变乱。

Alt text
将案件信息填充到表格中

详言之,操作如下:

  • 准备一份表单模板,理论上任何表单都可以;
  • 在需要填写的空格处逐个填好占位的关键字,之后它们会被替换为真实数据,我习惯使用 k01k02 这样的关键字,这种拼写并不常见,可以避免和表单中的实际内容混淆;
  • 注意保持各个空格处的关键词,需与原始数据表单中的序号对应上,方能正常填充,
  • 打开 Numbers 文件,复制表格中所需数据的区域,不要沾上其他内容;
  • 转到 Word 文档,全选整个表单,运行下面的 AppleScript 代码。结束。5
set i to 0

set vList to {}
set ccc to the clipboard
set urlContents to (paragraphs of ccc)
repeat with nextLine in urlContents
    if length of nextLine is greater than 0 then
        set the end of vList to (nextLine as text)
    end if
end repeat

tell application "Microsoft Word"
    set findRange to find object of selection
    repeat with k in {"k01", "k02", "k03", "k04", "k05", "k06", "k07", "k08", "k09", "k10", "k11", "k12", "k13", "k14", "k15", "k16", "k17"}
        set i to i + 1
        set v to item i of vList
        tell findRange
            execute find find text k replace with v replace replace all
        end tell
    end repeat
end tell
Alt text
将案件信息填充到表格中

我选用 AppleScript,只因其实现起来更方便,毕竟我是不得已才用 Word,毫无学习 VB 的动力,只想用更加熟悉 AppleScript 解决问题。你还可以把 AppleScript 嵌入多数自动化工具,比如 Keyboard Maestro,方便绑定快捷键使用。这里有一个我制作的 Keyboard Maestro 版本。

此外,我最初也考虑过略过 Numbers,只用 Keyboard Maestro,可惜需要设置非常多的变量,假设你要填写的表单有二十个空格,就要增加二十个变量;如果要填写五个不同的表单(实际中恐怕只多不少),变量数量就是膨胀到几十上百个。单单填表这一件事儿,就会淹没 Keyboard Maestro 的其他变量,恐怕是因小失大。


  1. 我近年先后从事的均为法律职业,它们一般都有比较规范的文档管理要求。其中绝对大有自动化空间。
  2. 我选用的表格工具是 Numbers,因为我基本不懂 Excel。只要你能够在 Excel 中整理好数据,当然可以用它。
  3. 和 AppleScript 的语法类似。
  4. k 表示 key,这是字典类数据结构中常见的称呼,我借用了其意象。不熟悉编程的读者不必深究。顺予指出,本文所谓的“填写”,当然是指预先有模板的情况,比如归档信息表。如果你需要从头开始做一个表单,并且只用一次,那当然没必要往下折腾。
  5. 我提供的脚本对应了 17 个空,因为我所用模板中的待填项是这个数。你可以根据自己的需要增增减减,不过只要脚本中的项目多于实际需要填的位置数量,运行就不会出错。

author_avatar

Lawyer, macOS/iOS Automation Amateur