使用 google 应用程序脚本从 google 文档中提取文本
Extract Text from google doc using google apps script
我有一个 google 文档。
https://docs.google.com/document/d/1ryvCCj1NCF12RnQx0IyluJmRpW740icoBLIFOJj2juE/edit?usp=sharing
我想从文档中提取红色文本部分[红色仅供参考]。
红色部分是 table 并列在文档文件的第 2 页和第 3 页。
我为 table 编写了代码,我很容易将其提取并粘贴到新的 doc 文件中。但是无法从第 3 页提取列表项。
function test(){
var sourcedoc = DocumentApp.openById('id');
var sourcebody = sourcedoc.getBody();
var tables = sourcebody.getTables();
var table = tables[0].copy();
var destdoc = DocumentApp.openById('id');
var destbody = destdoc.getBody();
var x = destbody.appendTable(table);
}
- 您想将源 Google 文档中的第一个 table 以及第二个和第三个列表复制到另一个 Google 文档。
- 在您的情况下,您希望在第一个 table 之后检索 2 个列表。并且您想检索 table 和列表之间的段落。
- 这是来自您的共享文档。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。
问题和解决方法:
很遗憾,在现阶段,Document service不能使用✓
的字形符号。这样,当通过设置原始字形符号复制字形符号为 ✓
的列表时,将使用默认符号。为了解决这个问题,我使用了以下流程。
- 复制 Google 文档。
- 从复制的Google文档中扫描要复制的范围。
- 从复制的 Google 文档中删除除要复制的范围之外的范围。
- 从复制的 Google 文档中删除内联对象。
通过以上流程,可以复制第一个table和第二个、第三个列表。为了实现这一点,我使用了 Google Docs API。因为你的Document中有几个内联对象,不幸的是,我找不到用Document服务删除它们的方法。内联对象可以通过 Docs API 删除,范围可以通过一次 API 调用删除。
示例脚本:
在你 运行 脚本之前,please enable Google Docs API at Advanced Google services.
function myFunction() {
var sourcedocId = '###'; // Please set the source Google Document ID.
var filenameOfDestDocument = "sampleDestDocument"; // Please set the destination filename of Google Document.
var fileId = DriveApp.getFileById(sourcedocId).makeCopy(filenameOfDestDocument).getId();
var doc = Docs.Documents.get(fileId);
var content = doc.body.content;
var obj = {table: 1, list: 2};
var reqs = [];
for (var i = 0; i < content.length; i++) {
if ("table" in content[i]) {
reqs.push({deleteContentRange: {range: {startIndex: 1, endIndex: content[i].startIndex - 1}}});
obj.table--;
} else if (obj.table == 0 && obj.list > 0 && "paragraph" in content[i] && "bullet" in content[i].paragraph) {
while ("paragraph" in content[i] && "bullet" in content[i].paragraph) ++i;
obj.list--;
} else if (obj.table == 0 && obj.list == 0) {
reqs.push({deleteContentRange: {range: {startIndex: content[i].endIndex, endIndex: content[content.length - 1].endIndex - 1}}});
break;
} else if ("paragraph" in content[i] && "positionedObjectIds" in content[i].paragraph) {
Array.prototype.push.apply(reqs, content[i].paragraph.positionedObjectIds.map(function(e) {return {deletePositionedObject: {objectId: e}}}));
}
}
Docs.Documents.batchUpdate({requests: reqs.reverse()}, fileId);
}
注:
- 在此脚本中,目标 Google 文档创建到与源 Google 文档相同的文件夹。
- 在这种情况下,脚本可以用于您共享的Google文档。如果更改文件,请修改脚本。
参考文献:
- Document Service
- Advanced Google services
- Method: documents.get of Docs API
- Method: documents.batchUpdate of Docs API
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
我有一个 google 文档。 https://docs.google.com/document/d/1ryvCCj1NCF12RnQx0IyluJmRpW740icoBLIFOJj2juE/edit?usp=sharing
我想从文档中提取红色文本部分[红色仅供参考]。 红色部分是 table 并列在文档文件的第 2 页和第 3 页。
我为 table 编写了代码,我很容易将其提取并粘贴到新的 doc 文件中。但是无法从第 3 页提取列表项。
function test(){
var sourcedoc = DocumentApp.openById('id');
var sourcebody = sourcedoc.getBody();
var tables = sourcebody.getTables();
var table = tables[0].copy();
var destdoc = DocumentApp.openById('id');
var destbody = destdoc.getBody();
var x = destbody.appendTable(table);
}
- 您想将源 Google 文档中的第一个 table 以及第二个和第三个列表复制到另一个 Google 文档。
- 在您的情况下,您希望在第一个 table 之后检索 2 个列表。并且您想检索 table 和列表之间的段落。
- 这是来自您的共享文档。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。
问题和解决方法:
很遗憾,在现阶段,Document service不能使用✓
的字形符号。这样,当通过设置原始字形符号复制字形符号为 ✓
的列表时,将使用默认符号。为了解决这个问题,我使用了以下流程。
- 复制 Google 文档。
- 从复制的Google文档中扫描要复制的范围。
- 从复制的 Google 文档中删除除要复制的范围之外的范围。
- 从复制的 Google 文档中删除内联对象。
通过以上流程,可以复制第一个table和第二个、第三个列表。为了实现这一点,我使用了 Google Docs API。因为你的Document中有几个内联对象,不幸的是,我找不到用Document服务删除它们的方法。内联对象可以通过 Docs API 删除,范围可以通过一次 API 调用删除。
示例脚本:
在你 运行 脚本之前,please enable Google Docs API at Advanced Google services.
function myFunction() {
var sourcedocId = '###'; // Please set the source Google Document ID.
var filenameOfDestDocument = "sampleDestDocument"; // Please set the destination filename of Google Document.
var fileId = DriveApp.getFileById(sourcedocId).makeCopy(filenameOfDestDocument).getId();
var doc = Docs.Documents.get(fileId);
var content = doc.body.content;
var obj = {table: 1, list: 2};
var reqs = [];
for (var i = 0; i < content.length; i++) {
if ("table" in content[i]) {
reqs.push({deleteContentRange: {range: {startIndex: 1, endIndex: content[i].startIndex - 1}}});
obj.table--;
} else if (obj.table == 0 && obj.list > 0 && "paragraph" in content[i] && "bullet" in content[i].paragraph) {
while ("paragraph" in content[i] && "bullet" in content[i].paragraph) ++i;
obj.list--;
} else if (obj.table == 0 && obj.list == 0) {
reqs.push({deleteContentRange: {range: {startIndex: content[i].endIndex, endIndex: content[content.length - 1].endIndex - 1}}});
break;
} else if ("paragraph" in content[i] && "positionedObjectIds" in content[i].paragraph) {
Array.prototype.push.apply(reqs, content[i].paragraph.positionedObjectIds.map(function(e) {return {deletePositionedObject: {objectId: e}}}));
}
}
Docs.Documents.batchUpdate({requests: reqs.reverse()}, fileId);
}
注:
- 在此脚本中,目标 Google 文档创建到与源 Google 文档相同的文件夹。
- 在这种情况下,脚本可以用于您共享的Google文档。如果更改文件,请修改脚本。
参考文献:
- Document Service
- Advanced Google services
- Method: documents.get of Docs API
- Method: documents.batchUpdate of Docs API
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。