Google Apps脚本:尝试打开文件夹中的每个文档,提取其TOC并将其写入另一个文档

时间:2013-08-17 04:11:48

标签: google-apps-script

首先,感谢Serge insas提供了足够的帮助来编写这个脚本!

脚本运行,但不会给我任何类似于所需结果的内容。 我想做的是 (1)在给定文件夹中创建一个新文档(让我们称之为'myfolder')并为其编写标题。      这工作 - 有点。我得到一个文档,但它的图标是一个doc文件的小图像,但它的角落翻了。它只在观众中打开。它确实有标题,但我后来试图写它没什么。

(2)获取'myfolder'中所有文件的数组。这就是Serge的帮助进来的地方。他们需要转换成可读的文件。我认为这有效(稍后会详细介绍)。至少调试器没有抛出错误。我最终得到了一个'内容'数组。

(3)对于每个文档,获取文件名并提取目录。将其中的每一个附加到(1)中创建的文档中。为此,我使用了一个从一个迭代到contents.length的for循环。现在出现了第一个问题。无论content.length返回的内容都不正确,因为下一个循环,处理发生在大约文档数量的错误,不计算脚本生成的这些小半文档。我通过一个try-catch结构解决了这个问题,当它遇到一个未定义的文件时停止了。那个和执行记录表明脚本确实经历了那个循环。

所以这是大问题。无论那些小文档是什么,除了第一个介绍性的文章之外别无他物。

调试器没用。 (a)它没有显示日志文件。只是一个约会。 (b)如果我放置一个断点,它可以停在它上面,但我看到的主要是一个对象列表。如果我点击+号,我会得到一个方法列表。显示了一些非对象变量。不可能单步执行代码,因为从一行到下一行可能需要三分钟,所以调试它是相当困难的。

我能获得的唯一信息是执行记录确实表明我确实从文件中获取了doc对象。

我认为问题出在* doc = DocumentApp.openById(docObject [jj]); *,在下面的代码中以粗体显示。

抱歉奇怪的错误处理;我试图弄清楚什么是错的。唉,调试器告诉我Err是一个字符串,并没有给我任何价值。

代码的其余部分是否有效,我无法判断它是否存在,确实在第一次遇到粗体线时出错。

感谢您的耐心等待。

function listDocTOCsInFolder()
{
  // Thanks to crucial help from Serge insas via Stack Overflow.
  var afolder;       // Folder you want to work on
  var contents;      // Files in the folder
  var TOCListDoc;    // Document you will create to hold your TOC List
  var docObject = []; // Holds a list of documents created from contents
  var aname;
  var adoc;
  var err = "";
  var isErr = false;

  TOCListDoc = DocsList.createFile("TOCList", "Document TOC List");

  afolder = DocsList.getFolderById("0B-UcimyrHLl2bm1OanExaHotc2M")
  //Can't figure out what exactly constitutes the path of a folder.  

  TOCListDoc.addToFolder(afolder);

 // Get all the document files in your named folder. Unfortunately,they are not document objects
  var contents = afolder.getFilesByType(DocsList.FileType.DOCUMENT);

  // This loop gives you an array of DocumentApp objects.
  for (var ii = 0; ii < contents.length; ii++) 
  {   
    docObject.push(DocumentApp.openById(contents[ii].getId()));
  }  
     // Now you can do a for loop to gather up the contents into one document.
    Logger.log(contents.length);

    // It isn't clear what this actually gets, because unless I set a trap of
    // undefined documents, the loop keeps right on going.
    var len = docObject.length;
    var jj = 0;
    for(jj = 0; jj < len; II++ )
    {
      try 
      {

        **adoc = DocumentApp.openById(docObject[jj]);**
      }
      catch(err)
      {
        isErr = true;
      }

      if(!isErr)
      {
      // Get the information you want to write to your list doc

      var TOC = adoc.getAs(DocumentApp.ElementType.TABLE_OF_CONTENTS);
      logger.log(TOC);
      aname = adoc.getName();

      Logger.log(aname);

      body.appendParagraph(counter, name);

      body.appendParagraph(TOC);
      //.setHeading(DocumentApp.ParagraphHeading.HEADING1);
      }
      else
      {
        Logger.log("Errored out");
      }

  }

}

2 个答案:

答案 0 :(得分:0)

而不是
for(jj = 0; jj < len; II++ )
尝试for(jj = 0; jj < len; jj++ )
而是
并且:再次阅读troubleshooting guide ...

答案 1 :(得分:0)

当你说

  

“对于每个文档,获取文件名并提取表格   内容。将其中的每一个附加到(1)

中创建的文档中

这确实是你应该做的......你使用了这段代码:

  // Get the information you want to write to your list doc

  var TOC = adoc.getAs(DocumentApp.ElementType.TABLE_OF_CONTENTS);
  logger.log(TOC);

但是这样做你认为本文档中的第一个元素必然是TOC,我不确定你能做到这一点!!

我要尝试的是迭代所有文档的元素并检查每个元素的类型,然后将TOC 复制到新文档中。

最后查看this post以查看如何迭代文档的元素并检查它们的类型,这个脚本的目的是不同的,但我想这种方法可以帮助你。

祝你好运