在 Apps 脚本中的文本前添加分页符
Add page break before text in Apps Script
我正在尝试在某些文本之前插入分页符。
我尝试了这个 post 中的解决方案:
在文本后添加分页符,试了一下代码,之前无法添加。作为一种解决方法,我试图在添加分页符后添加段落文本,但无法正常工作。
我相信你的目标如下。
- 您想使用 Google Apps 脚本在 Google 文档中的文本词前插入分页符。
在这种情况下,我想使用 Google 文档 API 建议以下示例脚本。在 Google 文档 API,可以使用 index
将页面插入到文本中间。所以我觉得这个方向可能有点简单,工艺成本也可能会降低。该脚本的流程如下
- 使用 Docs API.
中的“documents.get”方法从 Google 文档中检索所有内容
- 创建使用文档中“documents.batchUpdate”方法的请求正文API。
- 请求正文到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 种模式。
请 link GCP 到 GAS 项目并在 API 控制台启用 Google 文档 API。
请在高级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。
我正在尝试在某些文本之前插入分页符。
我尝试了这个 post 中的解决方案:
在文本后添加分页符,试了一下代码,之前无法添加。作为一种解决方法,我试图在添加分页符后添加段落文本,但无法正常工作。
我相信你的目标如下。
- 您想使用 Google Apps 脚本在 Google 文档中的文本词前插入分页符。
在这种情况下,我想使用 Google 文档 API 建议以下示例脚本。在 Google 文档 API,可以使用 index
将页面插入到文本中间。所以我觉得这个方向可能有点简单,工艺成本也可能会降低。该脚本的流程如下
- 使用 Docs API. 中的“documents.get”方法从 Google 文档中检索所有内容
- 创建使用文档中“documents.batchUpdate”方法的请求正文API。
- 请求正文到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 种模式。
请 link GCP 到 GAS 项目并在 API 控制台启用 Google 文档 API。
请在高级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。