我有一个包含多个页面的单个Google文档。我想通过应用程序使用的分页符将其分开,并将每个页面保存到单独的文件中。值得注意的是,该文档中也包含图像。
无论如何,我已经看过google脚本提供的内容,而且它似乎没有任何方便的功能来逐页拆分文档。到目前为止我所拥有的是:
var current = DocumentApp.getActiveDocument();
var body = current.getBody();
var paragraphs = body.getParagraphs();
所以,我可以深入查看我的文档并获取段落,但我不知道从哪里开始。我的思考过程是获取段落,将它们全部附加到一个字符串中,然后在分页符处将其拆分。从那里,我可以轻松地创建新文档并保存它们。但是,一旦我得到段落,我就没有办法找到分页符号。同样,如何处理图像?每张图片都在它自己的页面上,那么它们每个都是自己的段落吗?
所以,我在这个问题上的主要关注点是如何逐页分解我的文档。对此的任何帮助都会很棒。
答案 0 :(得分:1)
嗯,这需要一些黑客攻击,但我想出了一些我需要的东西:
function splitAndSave()
{
var folder = getFolderName();
if (folder == null)
{
return false;
}
var PB = Doc().ElementType.PAGE_BREAK;
var doc = Doc().getActiveDocument();
var body = doc.getBody();
var par = body.getParagraphs();
var curPage = 1;
// Naming scheme for files
var page = Doc().create("pg" + curPage);
for (var i = 0; i < par.length; i++)
{
var hasbreak = false;
for (var j = 0; j < par[i].getNumChildren(); j++)
{
var child = par[i].getChild(j);
if (child.getType() == PB)
{
hasbreak = true;
break;
}
}
if (!hasbreak)
{
var seppar = par[i].copy();
page.getBody().appendParagraph(seppar);
}
else
{
var par1 = par[i].copy();
var par2 = par[1].copy();
var hitbreak = false;
for (var i1 = 0; i1 < par1.getNumChildren(); i1++)
{
if (par1.getChild(i1).getType() == PB)
{
hitbreak = true;
}
if (hitbreak)
{
par1.removeChild(par1.getChild(i1));
}
}
var hitbreak = false;
for (var i1 = 0; i1 < par2.getNumChildren(); i1++)
{
if (par2.getChild(i1).getType() == PB)
{
hitbreak = true;
}
if (!hitbreak || par2.getChild(i1).getType() == PB)
{
par2.removeChild(par2.getChild(i1));
}
}
page.getBody().appendParagraph(par1);
// Add file to folder
page.saveAndClose();
var file = DocsList.getFileById(page.getId());
file.addToFolder(folder);
// Need this step or your file ends up in two places
file.removeFromFolder(DocsList.getRootFolder());
curPage++;
// Naming scheme for files
page = Doc().create("pg" + curPage);
page.getBody().appendParagraph(par2);
}
}
page.saveAndClose();
var file = DocsList.getFileById(page.getId());
file.addToFolder(folder);
// Need this step or your file ends up in two places
file.removeFromFolder(DocsList.getRootFolder());
Ui().alert("Saving process complete");
}
帮助函数获取文件夹名称:
function getFolderName()
{
var response = Ui().prompt("Enter a folder name");
if (response.getSelectedButton() == Ui().Button.OK)
{
var folder = DocsList.createFolder(response.getResponseText());
return folder;
}
else
{
return null;
}
}
其他助手:
function Doc()
{
return DocumentApp;
}
function Ui()
{
return Doc().getUi();
}
这会逐页拆分Google文档,其命名约定为“pg”+递增数字。它还将它们放在提示符中指定的文件夹中。
这里需要注意的是,在您打算拆分的文档中,您需要在每个页面的末尾放置分页符。所以,基本上,当你进入下一页时按CTRL + ENTER。这不是什么大不了的事,实际上要快一遍又一遍地进入,直到你翻新页面为止。
哦,而且很慢。这对我来说没什么大不了的,因为我只需偶尔使用它。
答案 1 :(得分:0)
感谢Toncoso的实用性。谷歌改变了一些东西,所以我更新了使用DriveApp。仍然很慢,但它确实有效。
//all thanks to Toncoso who posted this on stack overflow
//https://stackoverflow.com/questions/22362504/use-google-script-to-separate-a-google-doc
//Updated 6/1/2018 for driveapp
function splitAndSave()
{
var folder = getFolderName();
if (folder == null)
{
return false;
}
var PB = Doc().ElementType.PAGE_BREAK;
var doc = Doc().getActiveDocument();
var body = doc.getBody();
var par = body.getParagraphs();
var curPage = 1;
// Naming scheme for files
var page = Doc().create("pg" + curPage);
for (var i = 0; i < par.length; i++)
{
var hasbreak = false;
for (var j = 0; j < par[i].getNumChildren(); j++)
{
var child = par[i].getChild(j);
if (child.getType() == PB)
{
hasbreak = true;
break;
}
}
if (!hasbreak)
{
var seppar = par[i].copy();
page.getBody().appendParagraph(seppar);
}
else
{
var par1 = par[i].copy();
var par2 = par[1].copy();
var hitbreak = false;
for (var i1 = 0; i1 < par1.getNumChildren(); i1++)
{
if (par1.getChild(i1).getType() == PB)
{
hitbreak = true;
}
if (hitbreak)
{
par1.removeChild(par1.getChild(i1));
}
}
var hitbreak = false;
for (var i1 = 0; i1 < par2.getNumChildren(); i1++)
{
if (par2.getChild(i1).getType() == PB)
{
hitbreak = true;
}
if (!hitbreak || par2.getChild(i1).getType() == PB)
{
par2.removeChild(par2.getChild(i1));
}
}
page.getBody().appendParagraph(par1);
// Add file to folder
page.saveAndClose();
var file = DriveApp.getFileById(page.getId());
DriveApp.getFolderById(folder.getId()).addFile(file);
//file.addToFolder(folder);
// Need this step or your file ends up in two places
DriveApp.getRootFolder().removeFile(file);
curPage++;
// Naming scheme for files
page = Doc().create("pg" + curPage);
page.getBody().appendParagraph(par2);
}
}
page.saveAndClose();
var file = DriveApp.getFileById(page.getId());
DriveApp.getFolderById(folder.getId()).addFile(file);
// Need this step or your file ends up in two places
DriveApp.getRootFolder().removeFile(file);
Ui().alert("Saving process complete");
}
function getFolderName()
{
var response = Ui().prompt("Enter a folder name");
if (response.getSelectedButton() == Ui().Button.OK)
{
var folder = DriveApp.createFolder(response.getResponseText());
return folder;
}
else
{
return null;
}
}
function Doc()
{
return DocumentApp;
}
function Ui()
{
return Doc().getUi();
}
答案 2 :(得分:-1)
哇,这很有用。我正在对其进行调整,以便将大文档中的稀疏页面转换为新文档 - 一个从大歌本中生成的音乐会曲目列表生成器。
但是,扫描整个文档以达到所需的 PB 数量,并为您需要导出的每个页面再次执行此操作似乎并不有效。仍在试图找出一个聪明的方法,但看起来 Google Docs 脚本无论如何都是有限的。
例如在 VBA 中这是可能的:
myOriginBigDoc.ActiveWindow.Selection.GoTo wdGoToPage, wdGoToAbsolute, myPageNumber
myOriginBigDoc.Bookmarks("\page").Range.Copy