在 Apps 脚本中的文本前添加分页符

Add page break before text in Apps Script

我正在尝试在某些文本之前插入分页符。

我尝试了这个 post 中的解决方案:

在文本后添加分页符,试了一下代码,之前无法添加。作为一种解决方法,我试图在添加分页符后添加段落文本,但无法正常工作。

我相信你的目标如下。

  • 您想使用 Google Apps 脚本在 Google 文档中的文本词前插入分页符。

在这种情况下,我想使用 Google 文档 API 建议以下示例脚本。在 Google 文档 API,可以使用 index 将页面插入到文本中间。所以我觉得这个方向可能有点简单,工艺成本也可能会降低。该脚本的流程如下

  1. 使用 Docs API.
  2. 中的“documents.get”方法从 Google 文档中检索所有内容
  3. 创建使用文档中“documents.batchUpdate”方法的请求正文API。
  4. 请求正文到Docsdocuments.batchUpdate的方法API.

示例脚本:

请将以下脚本复制粘贴到Google文档的脚本编辑器中,并设置searchPattern。并且,请在高级 Google 服务中启用 Google 文档 API。

function myFunction() {
  const searchText = "{{page break}}";  // Please set text. This script inserts the pagebreak before this text.
  
  // 1. Retrieve all contents from Google Document using the method of "documents.get" in Docs API.
  const docId = DocumentApp.getActiveDocument().getId();
  const res = Docs.Documents.get(docId);
  
  // 2. Create the request body for using the method of "documents.batchUpdate" in Docs API.
  let offset = 0;
  const requests = res.body.content.reduce((ar, e) => {
    if (e.paragraph) {
      e.paragraph.elements.forEach(f => {
        if (f.textRun) {
          const re = new RegExp(searchText, "g");
          let p = null;
          while (p = re.exec(f.textRun.content)) {
            ar.push({insertPageBreak: {location: {index: p.index + offset}}});
          }
        }
      })
    }
    offset = e.endIndex;
    return ar;
  }, []).reverse();
  
  // 3. Request the request body to the method of "documents.batchUpdate" in Docs API.
  Docs.Documents.batchUpdate({requests: requests}, docId);
}
  • 在此示例脚本中,const searchPattern = "{{page break}}" 用作插入分页符的文本。请根据实际情况修改。

结果:

当上述脚本为运行时,得到如下结果

从:

到:

参考文献:

已添加:

我确认 google-docs-api 也包含在您问题的标签中。所以我提出了一个使用 Google Docs API 的示例脚本。但是从您的以下回复来看,您似乎想使用 Google Docs API 而没有在 Advanced Google 服务中启用 Google Docs API。我从你的问题和标签中没有注意到这一点。

is there a way of doing this without having to enable the Google Docs API in the Apps Script environment? I get a Reference Error for Docs.Documents.get(docId) if I don't.

关于您的回复,我再添加一个示例脚本。在此示例脚本中,Google Docs API 与 UrlFetchApp 一起使用。所以 Google Docs API of Advanced Google 服务没有使用。但是,在这种情况下,需要在 API 控制台启用 Google 文档 API。所以我为此提出了 2 种模式。

  1. 请 link GCP 到 GAS 项目并在 API 控制台启用 Google 文档 API。

  2. 请在高级Google服务中启用Google文档API一次并保存GAS项目。在这里,请稍等片刻。然后,请在高级 Google 服务中禁用 Google 文档 API。在当前阶段,似乎即使 Google Docs API 在 Advanced Google 服务中被禁用,Google Docs API 在 [=93] 中也没有被禁用=] 控制台。但我不确定这是否是永久的情况。但是,现在,我认为这可能可以用于您的情况。

示例脚本:

在使用此脚本之前,请在 API 控制台启用 Google Docs API,方法是执行我上面建议的其中一项和 运行 脚本。

function myFunction() {
  const searchText = "{{page break}}";  // Please set text. This script inserts the pagebreak before this text.
  
  // 1. Retrieve all contents from Google Document using the method of "documents.get" in Docs API.
  const accessToken = ScriptApp.getOAuthToken();
  const docId = DocumentApp.getActiveDocument().getId();
  const url1 = "https://docs.googleapis.com/v1/documents/" + docId;
  const response1 = UrlFetchApp.fetch(url1, {headers: {authorization: "Bearer " + accessToken}});
  const res = JSON.parse(response1.getContentText());

  // 2. Create the request body for using the method of "documents.batchUpdate" in Docs API.
  let offset = 0;
  const requests = res.body.content.reduce((ar, e) => {
    if (e.paragraph) {
      e.paragraph.elements.forEach(f => {
        if (f.textRun) {
          const re = new RegExp(searchText, "g");
          let p = null;
          while (p = re.exec(f.textRun.content)) {
            ar.push({insertPageBreak: {location: {index: p.index + offset}}});
          }
        }
      })
    }
    offset = e.endIndex;
    return ar;
  }, []).reverse();
  
  // 3. Request the request body to the method of "documents.batchUpdate" in Docs API.
  const url2 = `https://docs.googleapis.com/v1/documents/${docId}:batchUpdate`;
  UrlFetchApp.fetch(url2, {method: "post", payload: JSON.stringify({requests: requests}), contentType: "application/json", headers: {authorization: "Bearer " + accessToken}});

  // DocumentApp.getActiveDocument(); // This is used for automatically adding a scope of https://www.googleapis.com/auth/documents by the script editor.
}

注:

  • 当发生与Google Docs API相关的错误时,请在API控制台重新启用Google Docs API。