使用 Google Doc Apps 脚本缓存选定的文本元素
Caching Selected Text Element with Google Doc Apps Script
更新:这是提出以下问题的更好方法。
Document
中的 Element
是否有类似 Id
的属性,我以后可以使用它来访问该元素。假设我在文档中插入了一个段落,如下所示:
var myParagraph = 'This should be highlighted when user clicks a button';
body.insertParagraph(0, myParagraph);
然后用户在开头手动插入另一个(即通过键入或粘贴)。现在我段落的 childIndex
从 0
变成了 1
。我想稍后到达该段落并突出显示它。但是由于插入,childIndex
不再有效。 Element
接口或任何实现它的类型都没有类似 Id
的属性。 CahceService
和 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.
错误。
var cache = CacheService.getDocumentCache();
cache.get('text').insertText(0, ':)');
我希望我能清楚地解释我想要达到的目标。
不确定缓存是否是最佳方法。缓存是易变的,所以缓存的值可能不存在了。可能 PropertiesService 是更好的选择。
一种直接的方法是添加一个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!");
}
}
第一个函数"marks"第三段为命名范围。尽管随后的文档发生了变化,但第二个通过范围名称采用该段落。真的在这里我们需要考虑例外情况,当我们的 "unique paragraph" 被删除时。
更新:这是提出以下问题的更好方法。
Document
中的 Element
是否有类似 Id
的属性,我以后可以使用它来访问该元素。假设我在文档中插入了一个段落,如下所示:
var myParagraph = 'This should be highlighted when user clicks a button';
body.insertParagraph(0, myParagraph);
然后用户在开头手动插入另一个(即通过键入或粘贴)。现在我段落的 childIndex
从 0
变成了 1
。我想稍后到达该段落并突出显示它。但是由于插入,childIndex
不再有效。 Element
接口或任何实现它的类型都没有类似 Id
的属性。 CahceService
和 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.
错误。
var cache = CacheService.getDocumentCache();
cache.get('text').insertText(0, ':)');
我希望我能清楚地解释我想要达到的目标。
不确定缓存是否是最佳方法。缓存是易变的,所以缓存的值可能不存在了。可能 PropertiesService 是更好的选择。
一种直接的方法是添加一个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!");
}
}
第一个函数"marks"第三段为命名范围。尽管随后的文档发生了变化,但第二个通过范围名称采用该段落。真的在这里我们需要考虑例外情况,当我们的 "unique paragraph" 被删除时。