テキストをドキュメントに結合する

Google Docs API の便利なアプリケーションの 1 つは、1 つのスプレッドシートの情報を 1 つの ドキュメントに変換できます

このページでは、外部ソースからデータを取得して挿入する方法について説明します。 既存のテンプレートドキュメントに挿入できます

テンプレートは特殊なタイプのドキュメントで、テンプレートから作成されるすべてのドキュメントに対して同じ固定テキストを追加し、プレースホルダを指定します。 他の動的テキストを配置できる場所に配置されますたとえば、契約書のテンプレートには固定的なコンテンツを用意し、受信者の名前、住所、住所、 その他の詳細が表示されます。アプリは顧客固有のデータをテンプレートに統合できる ドキュメントを作成できます

このアプローチが有用である理由はいくつかあります。

  • デザイナーは、Gemini を使用してドキュメントのデザインを簡単に微調整できます。 Google ドキュメント エディタです。これは、Terraform でパラメータを調整するよりもはるかに簡単です。 レンダリングされたレイアウトを設定します。

  • コンテンツをプレゼンテーションから分離することはよく知られた設計 多くのメリットをもたらします

統合の概念図。

基本的なレシピ

次に、Document API を使用してデータを 1 つのドキュメントに結合する方法の例を示します。

  1. 次を使用してドキュメントを作成します: プレースホルダ コンテンツが含まれ、デザインと形式に役立ちます。置き換え対象のテキストの書式は保持されます。

  2. 挿入する要素ごとに、プレースホルダのコンテンツを できます。通常は使用されない文字列を使用してください。たとえば {{account-holder-name}} が適したタグです。

  3. コード内で、Google Drive API を使用してドキュメントのコピーを作成します。

  4. コード内で、Document API の batchUpdate() メソッドを次のように使用します。 ドキュメント名を入力し、 ReplaceAllTextRequest

ドキュメント ID はドキュメントを参照しており、URL から導出できます。

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

次の例では、すべてのタブの 2 つのフィールドを置き換えます。 実際の値でテンプレートを作成し、完成したドキュメントを生成します。

この統合を行うには、以下のコードを使用します。

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. 次を使用してドキュメントを作成 Docs API の documents.create
  2. 以下のコマンドを使用して、ドキュメントの受信者が読み取れるように権限を更新します。 permissions.create: フォルダ Drive API
  3. テンプレート作成者による書き込みを許可するように、権限を更新します。 permissions.create: フォルダ Drive API
  4. 必要に応じてテンプレートを編集します。

ドキュメントのインスタンスを作成するには、次の手順を行います。 次のようにユーザー認証情報に置き換えます。

  1. 次のコマンドを使用して、テンプレートのコピーを作成します。 Drive API の files.copy
  2. 次を使用して値を置換します: documents.batchUpdate 説明します。