使用Google脚本分隔Google文档

时间:2014-03-12 19:59:19

标签: google-apps-script google-docs

我有一个包含多个页面的单个Google文档。我想通过应用程序使用的分页符将其分开,并将每个页面保存到单独的文件中。值得注意的是,该文档中也包含图像。

无论如何,我已经看过google脚本提供的内容,而且它似乎没有任何方便的功能来逐页拆分文档。到目前为止我所拥有的是:

var current = DocumentApp.getActiveDocument();
var body = current.getBody();
var paragraphs = body.getParagraphs();

所以,我可以深入查看我的文档并获取段落,但我不知道从哪里开始。我的思考过程是获取段落,将它们全部附加到一个字符串中,然后在分页符处将其拆分。从那里,我可以轻松地创建新文档并保存它们。但是,一旦我得到段落,我就没有办法找到分页符号。同样,如何处理图像?每张图片都在它自己的页面上,那么它们每个都是自己的段落吗?

所以,我在这个问题上的主要关注点是如何逐页分解我的文档。对此的任何帮助都会很棒。

3 个答案:

答案 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