Zaawansowana usługa Dokumentów

Zaawansowana usługa Dokumenty pozwala korzystać z interfejsu Google Docs API w Apps Script. Ten interfejs API, podobnie jak wbudowana usługa Dokumenty w Apps Script, umożliwia skryptom odczytywanie, edytowanie i formatowanie treści w Dokumentach Google. W większości przypadków wbudowana usługa jest łatwiejsza w użyciu, ale ta zaawansowana usługa ma jednak kilka dodatkowych funkcji.

Dokumentacja

Szczegółowe informacje o tej usłudze znajdziesz w dokumentacji interfejsu Docs API. Podobnie jak wszystkie usługi zaawansowane w Apps Script, zaawansowana usługa Dokumenty korzysta z tych samych obiektów, metod i parametrów co publiczny interfejs API. Więcej informacji znajdziesz w artykule Jak określane są podpisy metod.

Aby zgłosić problemy i znaleźć inną pomoc, zapoznaj się z przewodnikiem po interfejsie Docs API.

Przykładowy kod

W przykładowym kodzie poniżej użyto wersji 1 interfejsu API.

Utworzenie dokumentu

Ten przykład tworzy nowy dokument.

advanced/docs.gs
/**
 * Create a new document.
 * @see https://developers.google.com/docs/api/reference/rest/v1/documents/create
 * @return {string} documentId
 */
function createDocument() {
  try {
    // Create document with title
    const document = Docs.Documents.create({'title': 'My New Document'});
    console.log('Created document with ID: ' + document.documentId);
    return document.documentId;
  } catch (e) {
    // TODO (developer) - Handle exception
    console.log('Failed with error %s', e.message);
  }
}

Znajdowanie i zastępowanie tekstu

W tym przykładzie znajdujemy i zastępujemy pary tekstu w dokumencie. Może to być przydatne podczas zastępowania obiektów zastępczych w kopii dokumentu szablonu wartościami z bazy danych.

advanced/docs.gs
/**
 * Performs "replace all".
 * @param {string} documentId The document to perform the replace text operations on.
 * @param {Object} findTextToReplacementMap A map from the "find text" to the "replace text".
 * @return {Object} replies
 * @see https://developers.google.com/docs/api/reference/rest/v1/documents/batchUpdate
 */
function findAndReplace(documentId, findTextToReplacementMap) {
  const requests = [];
  for (const findText in findTextToReplacementMap) {
    const replaceText = findTextToReplacementMap[findText];
    const request = {
      replaceAllText: {
        containsText: {
          text: findText,
          matchCase: true
        },
        replaceText: replaceText
      }
    };
    requests.push(request);
  }
  try {
    const response = Docs.Documents.batchUpdate({'requests': requests}, documentId);
    const replies = response.replies;
    for (const [index] of replies.entries()) {
      const numReplacements = replies[index].replaceAllText.occurrencesChanged || 0;
      console.log('Request %s performed %s replacements.', index, numReplacements);
    }
    return replies;
  } catch (e) {
    // TODO (developer) - Handle exception
    console.log('Failed with error : %s', e.message);
  }
}

Wstawianie tekstu i zmiana jego stylu

Ten przykład wstawia nowy tekst na początku dokumentu i dodaje style, jeśli mają określoną czcionkę i określony rozmiar. Pamiętaj, że jeśli to możliwe, należy zgrupować wiele operacji w 1 wywołaniu batchUpdate, aby zwiększyć wydajność.

advanced/docs.gs
/**
 * Insert text at the beginning of the document and then style the inserted
 * text.
 * @param {string} documentId The document the text is inserted into.
 * @param {string} text The text to insert into the document.
 * @return {Object} replies
 * @see https://developers.google.com/docs/api/reference/rest/v1/documents/batchUpdate
 */
function insertAndStyleText(documentId, text) {
  const requests = [{
    insertText: {
      location: {
        index: 1
      },
      text: text
    }
  },
  {
    updateTextStyle: {
      range: {
        startIndex: 1,
        endIndex: text.length + 1
      },
      textStyle: {
        fontSize: {
          magnitude: 12,
          unit: 'PT'
        },
        weightedFontFamily: {
          fontFamily: 'Calibri'
        }
      },
      fields: 'weightedFontFamily, fontSize'
    }
  }];
  try {
    const response =Docs.Documents.batchUpdate({'requests': requests}, documentId);
    return response.replies;
  } catch (e) {
    // TODO (developer) - Handle exception
    console.log('Failed with an error %s', e.message);
  }
}

Przeczytaj pierwszy akapit

Ten przykładowy akapit zapisuje tekst pierwszego akapitu dokumentu. Ze względu na strukturę akapitów interfejsu Docs API trzeba połączyć tekst wielu elementów podrzędnych.

advanced/docs.gs
/**
 * Read the first paragraph of the body of a document.
 * @param {string} documentId The ID of the document to read.
 * @return {Object} paragraphText
 * @see https://developers.google.com/docs/api/reference/rest/v1/documents/get
 */
function readFirstParagraph(documentId) {
  try {
    // Get the document using document ID
    const document = Docs.Documents.get(documentId);
    const bodyElements = document.body.content;
    for (let i = 0; i < bodyElements.length; i++) {
      const structuralElement = bodyElements[i];
      // Print the first paragraph text present in document
      if (structuralElement.paragraph) {
        const paragraphElements = structuralElement.paragraph.elements;
        let paragraphText = '';

        for (let j = 0; j < paragraphElements.length; j++) {
          const paragraphElement = paragraphElements[j];
          if (paragraphElement.textRun !== null) {
            paragraphText += paragraphElement.textRun.content;
          }
        }
        console.log(paragraphText);
        return paragraphText;
      }
    }
  } catch (e) {
    // TODO (developer) - Handle exception
    console.log('Failed with error %s', e.message);
  }
}

Sprawdzone metody

Aktualizacje zbiorcze

Jeśli korzystasz z zaawansowanej usługi Dokumenty, połącz wiele żądań w tablicy, zamiast wywoływać funkcję batchUpdate w pętli.

Nie – wywołaj zapętloną metodę użytkownika batchUpdate.

var textToReplace = ['foo', 'bar'];
for (var i = 0; i < textToReplace.length; i++) {
  Docs.Documents.batchUpdate({
    requests: [{
      replaceAllText: ...
    }]
  }, docId);
}

Zalecane – wywołaj batchUpdate z tablicą aktualizacji.

var requests = [];
var textToReplace = ['foo', 'bar'];
for (var i = 0; i < textToReplace.length; i++) {
  requests.push({ replaceAllText: ... });
}

Docs.Documents.batchUpdate({
  requests: requests
}, docId);