# 一键填写 Microsoft Word 表单的半自动化方法

> 本文公开全文。

原文：https://utgd.net/article/20143

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

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

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

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

## 分析问题

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

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

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

## 整理表单数据

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

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

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

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

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

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

## 一键自动填充

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

详言之，操作如下：

- 准备一份表单模板，理论上任何表单都可以；

- 在需要填写的空格处逐个填好占位的关键字，之后它们会被替换为真实数据，我习惯使用 k01、k02 这样的关键字，这种拼写并不常见，可以避免和表单中的实际内容混淆；

- 注意保持各个空格处的关键词，需与原始数据表单中的序号对应上，方能正常填充，

- 打开 Numbers 文件，复制表格中所需数据的区域，不要沾上其他内容；

- 转到 Word 文档，全选整个表单，运行下面的 AppleScript 代码。结束。

```
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
```

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

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

---

[前往标准阅读页](https://utgd.net/article/20143?audience=web)
