将文本合并到文档中

Google 文档 API 的一个实用应用是将来自一个或多个数据源的信息合并到文档中。

本页概述了如何从外部来源获取数据,并将其插入现有模板文档中。

模板是一种特殊类型的文档,其中包含通过模板创建的所有文档的相同固定文本,以及可放置其他动态文本的指定占位符。例如,合同模板可能包含固定内容,以及接收者的姓名、地址和其他详细信息。然后,您的应用可以将特定于客户的数据合并到模板中以创建完成的文档。

此方法之所以有用,原因如下:

  • 设计人员可以使用 Google 文档编辑器轻松微调文档的设计。这比调整应用中的参数来设置渲染的布局要容易得多。

  • 将内容与演示文稿分离是众所周知的设计原则,它具有许多优势。

合并的概念图。

基本食谱

以下示例展示了如何使用 Docs API 将数据合并到文档中:

  1. 使用占位内容创建文档,以帮助您了解设计和格式。系统会保留您要替换的所有文本格式。

  2. 对于您要插入的每个元素,请将占位符内容替换为标记。请务必使用一般情况下不太可能出现的字符串。例如,{{account-holder-name}} 可能就是一个很好的标记。

  3. 在您的代码中,使用 Google 云端硬盘 API 创建文档副本。

  4. 在您的代码中,使用 Docs API 的 batchUpdate() 方法和文档名称,并添加 ReplaceAllTextRequest

文档 ID 会引用文档,并且可以通过网址获得

https://docs.google.com/document/d/documentId/edit

示例

下面的示例将模板中的 2 个字段替换为实际值,以生成已完成的文档。

如需执行此合并,您可以使用以下代码。

Java

        String customerName = "Alice";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        String date = formatter.format(LocalDate.now());

        List<Request> requests = new ArrayList<>();
        requests.add(new Request()
                .setReplaceAllText(new ReplaceAllTextRequest()
                        .setContainsText(new SubstringMatchCriteria()
                                .setText("{{customer-name}}")
                                .setMatchCase(true))
                        .setReplaceText(customerName)));
        requests.add(new Request()
                .setReplaceAllText(new ReplaceAllTextRequest()
                        .setContainsText(new SubstringMatchCriteria()
                                .setText("{{date}}")
                                .setMatchCase(true))
                        .setReplaceText(date)));

        BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest();
        service.documents().batchUpdate(documentId, body.setRequests(requests)).execute();

Node.js

  let customerName = 'Alice';
  let date = yyyymmdd()
  let requests = [
    {
      replaceAllText: {
        containsText: {
          text: '{{customer-name}}',
          matchCase: true,
        },
        replaceText: customerName,
      },
    },
    {
      replaceAllText: {
        containsText: {
          text: '{{date}}',
          matchCase: true,
        },
        replaceText: date,
      },
    },
  ];

  google.options({auth: auth});
  google
      .discoverAPI(
          'https://docs.googleapis.com/$discovery/rest?version=v1&key={YOUR_API_KEY}')
      .then(function(docs) {
        docs.documents.batchUpdate(
            {
              documentId: '1yBx6HSnu_gbV2sk1nChJOFo_g3AizBhr-PpkyKAwcTg',
              resource: {
                requests,
              },
            },
            (err, {data}) => {
              if (err) return console.log('The API returned an error: ' + err);
              console.log(data);
            });
      });

Python

    customer_name = 'Alice'
    date = datetime.datetime.now().strftime("%y/%m/%d")

    requests = [
         {
            'replaceAllText': {
                'containsText': {
                    'text': '{{customer-name}}',
                    'matchCase':  'true'
                },
                'replaceText': customer_name,
            }}, {
            'replaceAllText': {
                'containsText': {
                    'text': '{{date}}',
                    'matchCase':  'true'
                },
                'replaceText': str(date),
            }
        }
    ]

    result = service.documents().batchUpdate(
        documentId=document_id, body={'requests': requests}).execute()

管理模板

对于应用定义并拥有的模板文档,请使用代表应用的专用帐号创建模板。服务帐号是一个不错的选择,可以避免限制共享的 Google Workspace 政策的复杂性。

通过模板创建文档实例时,请始终使用最终用户凭据。这可让用户完全控制生成的文档,并防止云端硬盘中与每位用户限制相关的扩缩问题。

如需使用服务帐号创建模板,请使用应用凭据执行以下步骤:

  1. 在 Docs API 中使用 documents.create 创建文档。
  2. 更新权限,允许文档收件人使用 Drive API 中的 permissions.create 权限读取文档。
  3. 更新权限,允许模板作者使用 Drive API 中的 permissions.create 方法向其写入数据。
  4. 根据需要修改模板。

如需创建文档的实例,请使用用户凭据执行以下步骤:

  1. 在 Drive API 中使用 files.copy 创建模板的副本。
  2. 使用 Docs API 中的 documents.batchUpdate 替换值。