使用Google Doc Apps脚本缓存选定的文本元素

时间:2019-01-23 06:22:47

标签: javascript google-apps-script google-docs-api

更新:这是询问以下问题的更好方法。

Id中是否有Element的{​​{1}}相似属性,以后可以用来访问该元素。假设我在文档中插入了一个段落,如下所示:

Document

然后,用户手动(即通过键入或粘贴)在开头插入另一个。现在,我的段落的var myParagraph = 'This should be highlighted when user clicks a button'; body.insertParagraph(0, myParagraph); childIndex变为1。我想稍后再谈及该段内容。但是由于插入,0不再有效。 childIndex接口没有Id类属性,也没有任何实现该类型的类型。 ElementCahceService仅接受PropertiesService数据,因此我无法将String存储为myParagraph

你们有什么想法要实现我想要的吗?

谢谢

同一问题的旧版本(可选阅读):

想象一下,用户选择了一个单词并按下了我的加载项的突出显示按钮。然后她再做几个字就做同样的事情。然后,她编辑文档,使那些突出显示的单词的开始-结束索引更改。

此时,她按下删除突出显示按钮。我的加载项应禁用所有先前选择的单词的突出显示。问题是我不想扫描整个文档并找到任何突出显示的文本。我只想直接访问以前选择的那些。

有没有办法做到这一点?我尝试缓存选定的元素。但是,当我从缓存取回它们时,出现Object错误。似乎对象的类型或在TypeError: Cannot find function insertText in object Text.cache.put()之间发生了变化。

cache.get()

当我取回元素时,我得到var elements = selection.getSelectedElements(); for (var i = 0; i < elements.length; ++i) { if (elements[i].isPartial()) { Logger.log('partial'); var element = elements[i].getElement().asText(); var cache = CacheService.getDocumentCache(); cache.put('element', element); var startIndex = elements[i].getStartOffset(); var endIndex = elements[i].getEndOffsetInclusive(); } // ... } 错误。

TypeError: Cannot find function insertText in object Text.

我希望我能清楚地说明我想要实现的目标。

2 个答案:

答案 0 :(得分:2)

一种直接的方法是添加一个bookmark,它不依赖于随后的文档更改。它有一个缺点:每个人都可以看到书签...

更有趣的方法是添加一个具有唯一名称的named range。示例代码如下:

function setNamedParagraph() {
  var doc = DocumentApp.getActiveDocument();
  // Suppose you want to remember namely the third paragraph (currently)
  var par = doc.getBody().getParagraphs()[2];
  Logger.log(par.getText());
  var rng = doc.newRange().addElement(par);
  doc.addNamedRange("My Unique Paragraph", rng);
}


function getParagraphByName() {
  var doc = DocumentApp.getActiveDocument();
  var rng = doc.getNamedRanges("My Unique Paragraph")[0];
  if (rng) {
    var par = rng.getRange().getRangeElements()[0].getElement().asParagraph();
    Logger.log(par.getText());
  } else {
    Logger.log("Deleted!");
  }
}

第一个函数将第三段“标记”为命名范围。尽管随后进行了文档更改,但第二个命令还是以范围名称作为该段。确实在这里,当我们删除“唯一段落”时,我们需要考虑例外情况。

答案 1 :(得分:0)

不确定缓存是否是最佳方法。缓存是易失性的,因此可能会发生缓存值不再存在的情况。可能PropertiesService是更好的选择。