将文本合并到文档中

Google 文档 API 的一项实用应用是,将来自 Google 文档的信息 一个或多个数据源导入文档

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

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

这种方法很有用,原因如下:

  • 设计人员可以轻松 Google 文档编辑器。这比在 设置渲染的布局。

  • 众所周知,将内容与演示文稿分离开来 具有诸多益处。

合并的概念图。

基本食谱

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

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

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

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

  4. 在代码中,将 Google 文档 API 的 batchUpdate() 方法与 文档名称,并添加 ReplaceAllTextRequest

文档 ID 引用了文档,并且可以从网址派生而来

https://docs.google.com/document/d/documentId/edit
<ph type="x-smartling-placeholder">

示例

不妨参考下面的示例,它替换了 真实值来生成最终文档。

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

Java

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

List<Request> requests = new ArrayList<>();
// One option for replacing all text is to specify all tab IDs.
requests.add(new Request()
        .setReplaceAllText(new ReplaceAllTextRequest()
                .setContainsText(new SubstringMatchCriteria()
                        .setText("{{customer-name}}")
                        .setMatchCase(true))
                .setReplaceText(customerName)
                .setTabsCriteria(new TabsCriteria()
                        .addTabIds(TAB_ID_1)
                        .addTabIds(TAB_ID_2)
                        .addTabIds(TAB_ID_3))));
// Another option is to omit TabsCriteria if you are replacing across all tabs.
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 = [
    // One option for replacing all text is to specify all tab IDs.
    {
      replaceAllText: {
        containsText: {
          text: '{{customer-name}}',
          matchCase: true,
        },
        replaceText: customerName,
        tabsCriteria: {
          tabIds: [TAB_ID_1, TAB_ID_2, TAB_ID_3],
        },
      },
    },
    // Another option is to omit TabsCriteria if you are replacing across all tabs.
    {
      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 = [
        # One option for replacing all text is to specify all tab IDs.
        {
        'replaceAllText': {
            'containsText': {
                'text': '{{customer-name}}',
                'matchCase':  'true'
            },
            'replaceText': customer_name,
            'tabsCriteria': {
                'tabIds': [TAB_ID_1, TAB_ID_2, TAB_ID_3],
            },
        }},
        # Another option is to omit TabsCriteria if you are replacing across all tabs.
        {
        'replaceAllText': {
            'containsText': {
                'text': '{{date}}',
                'matchCase':  'true'
            },
            'replaceText': str(date),
        }
    }
]

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

管理模板

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

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

如需使用服务账号创建模板,请根据名称 应用凭据:

  1. 使用以下应用创建文档: Google 文档 API 中的 documents.create
  2. 更新权限以允许文档收件人使用 permissions.create Drive API
  3. 更新权限以允许模板作者使用 permissions.create Drive API
  4. 根据需要修改模板。

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

  1. 使用 Drive API 中的 files.copy
  2. 使用以下参数替换值: documents.batchUpdate 文档 API 中的文档。