如何存储复制的google文档元素?

时间:2017-12-28 08:06:59

标签: google-apps-script google-docs

我的代码目前在google文档中搜索预定义的开始标记,并找到相应的结束标记。标签的位置保留在变量中。

接下来,代码会运行并将标记之间的所有元素复制到第二个Google文档中。这按预期工作。

但是,源文档中保存的数据已经增长到100页。因此,搜索标记的脚本需要几秒钟的时间。这会增加查找标记并在它们之间复制元素所需的时间。

我的解决方案是使用一个主脚本来获取元素一次并将它们存储在Firebase或Firestore之类的内容中。然后我可以直接从DB访问元素。我尝试了几种存储Google文档元素的方法。

这就是我获取元素的方式。

  var element = sourceDoc.getChild(j).copy(); // Gets Paragraph etc.

我的尝试包括。

  • 将元素存储在数组中,然后迭代数组 - 在其中正常工作 相同的运行时间。
  • 将元素存储在文档缓存中 - 不起作用。
  • 尝试将元素存储为blob - 不知道如何正确执行。
  • 对元素进行字符串化并保存在文档缓存中 - 不起作用。

是否有人尝试保存Google文档元素以供日后使用?

1 个答案:

答案 0 :(得分:0)

似乎Google文档元素没有可以在Apps脚本环境之外使用的表示形式。我建议使用其他较小的文档来存储以后需要的元素。脚本可以根据需要创建文档(up to 250 per day)并稍后通过其ID访问它们。 ID是字符串;它们可以与您定位这些元素的某些键相关联,并且此信息可以通过JSON字符串化并存储在脚本属性中。

由于没有appendElement方法,似乎必须首先按类型标识元素,然后追加到目标(而不是每个类型都由append方法支持)。

function storeElements() {
  var elements = ... // your array of elements

  var storage = DocumentApp.create("storage"); // if new is needed
  var body = storage.getBody();
  for (var i in elements) {
    switch (selected[i].getType()) {
        case DocumentApp.ElementType.INLINE_IMAGE:
        body.appendImage(elements[i]); break;
        case DocumentApp.ElementType.LIST_ITEM:
        body.appendListItem(elements[i]); break;
        case DocumentApp.ElementType.PARAGRAPH:
        body.appendParagraph(elements[i]); break;
        case DocumentApp.ElementType.TABLE:
        body.appendTable(elements[i]); break;
        case DocumentApp.ElementType.HORIZONTAL_RULE:
        body.appendHorizontalRule(); break;
        case DocumentApp.ElementType.PAGE_BREAK:
        body.appendPageBreak(); break;
    }
  }
  // store storage.getId(); in ScriptProperties
}