引用元素的规范方式



有没有一种规范的方法可以在谷歌文档中的元素上设置ID或其他可搜索的持久数据属性,这样我以后就可以很容易地引用它了?我正在寻找类似于javascript中的getElementById的东西。我看到的几乎所有例子,包括谷歌自己的文档,似乎都是通过搜索文本字符串或插入新字符串来引用对象的。

我在NamedRanges类中找到了一个对getId函数的引用,但我找不到任何位置来设置该ID。我确实在Elements上看到了setAttributes函数,但它似乎只适用于预定义的属性类型。不过我还没有测试过。

如果它是相关的:我的兴趣是从谷歌工作表中自动创建一个文档,并根据工作表中的当前值进行填充。我想为特定的元素分配单独的ID,这样我就可以很容易地检索元素,并在以后工作表中的值发生变化时替换文本。

事实证明,使用NamedRanges是可能的,只是我读得不够仔细。

注意:下面所有的例子都在这个谷歌文档中工作。您可以复制并选择";脚本编辑器"从"工具"菜单中查看代码。

使用应用程序脚本可以非常容易地分配命名范围。下面的代码在文档中查找[[TITLE]][[ABSTRACT]],并为这些块分配命名范围。请注意,在前面的文档中,我将它们放在一个表中,以避免部分范围的问题。

function assignNamedRanges() {
const doc = DocumentApp.getActiveDocument();
const body = doc.getBody();

const placeholders = ["title", "abstract"];
placeholders.forEach(p => {
const rangeBuilder = doc.newRange();
const text = body.findText("[[" + p.toUpperCase() + "]]");
rangeBuilder.addElement(text.getElement());
doc.addNamedRange(p, rangeBuilder.build());
});
}

一旦你分配了它们,你就可以在一个单独的功能中将范围更新为其他内容:

function updateNamedRanges() {
const doc = DocumentApp.getActiveDocument();
const body = doc.getBody();
const title = doc.getNamedRanges("title")[0];
const abstract = doc.getNamedRanges("abstract")[0];
title.getRange().getRangeElements()[0].getElement().asText().setText("Bob");
abstract.getRange().getRangeElements()[0].getElement().asText().setText("I like pancakes");
}

请注意,NamedRange是持久的,多个NamedRange实例可以具有相同的名称。这意味着,如果您运行第一个函数四次,您将有八个命名范围。你可以制作一个方便的功能,很容易地清除所有这些:

function clearNamedRanges() {
DocumentApp.getActiveDocument().getNamedRanges().forEach(r => {
r.remove();
})
}

所以我一直在AppScript中检查关于谷歌文档elements的文档,其中一些文档似乎可以修改,但不像文档中所示的那样自由:

可以插入粗体显示的元素;非粗体元素只能就地操作。

正如您所提到的,我尝试使用setAttributes进行检查,但属性本身只能来自文档元素,如:TEXT、PARGRAPH、TABLE等,这些元素无法接收ID,因为没有根据您的要求插入特定ID的方法,大多数可以插入的值都是特定的元素属性,如:字体大小、字体系列等。

最新更新