Google apps script 如何在GoogleApps脚本中将命名范围添加到子段落元素

Google apps script 如何在GoogleApps脚本中将命名范围添加到子段落元素,google-apps-script,google-docs,named-ranges,Google Apps Script,Google Docs,Named Ranges,我想在Google文档中实现一个“html span-like”功能,但每当我尝试向Google文档中的文本子字符串添加NamedRange时,该范围就会与同一段落中的先前文本合并 结果,NamedRange应用于整个段落 下面是我的测试用例: 函数createTextNamedRange(){ //检索当前文档的正文 var doc=DocumentApp.getActiveDocument(); var docBody=doc.getBody(); //添加文本为{NotNamed}的新段落

我想在Google文档中实现一个“html span-like”功能,但每当我尝试向Google文档中的文本子字符串添加
NamedRange
时,该范围就会与同一段落中的先前文本合并

结果,
NamedRange
应用于整个段落

下面是我的测试用例:

函数createTextNamedRange(){
//检索当前文档的正文
var doc=DocumentApp.getActiveDocument();
var docBody=doc.getBody();
//添加文本为{NotNamed}的新段落
var para=docBody.append段落('{NotNamed}');
//追加一些将命名的文本(.appendText()方法返回一个文本元素)
var textElem=para.appendText(“{NamedText}”);
//为文本元素构建一个范围
var range=doc.newRange().addElement(textElem.build();
//命名范围并将其附加到文档中
文件addNamedRange(“myNamedRange”,范围);
}
然后,我使用此函数中的
Logger
类显示
NamedRange
的内容:

函数getTextNamedRange(){ //检索命名范围 var namedRanges=DocumentApp.getActiveDocument().getNamedRanges(); //遍历名称“myNamedRange”的每个实例(只有一个) 用于(名称表中的变量编号){ var namedRange=namedRanges[nr]; //一个范围可能包含多个RangeElements,并对其进行迭代 var rangeElements=namedRange.getRange().getRangeElements(); for(范围元素中的var re){ //获取每个RangeElement的文本并将其显示在记录器中 var text=rangeElements[re].getElement().asText().getText(); Logger.log('namedRange('+namedRange.getName()+')文本:“'+Text+'”); } } } 我假设将
{NamedText}
作为输出,但日志窗口告诉我们:

Text with namedRange (myNamedRange) : "{NotNamed}{NamedText}"
可以看出,该范围应用于未标记文本和命名文本

我发现了,但绝对不是我喜欢的:它包括在
.appendText()
调用之间添加空的内联图像。这样就不会合并文本元素


我仍在寻找更好的解决方案。

以下内容仅适用于解决方案,但似乎有效

它依赖于必须命名的
文本块前后的
InlineImage
插入

当应用于
段落中的
文本块时,这将防止
命名区域
合并

函数createTextNamedRangeWorkaround(){
//解决方法:防止文本合并(从而防止NamedRange合并)
//通过使用空白内联图像分离文本元素
//导入一个空白的PNG文件
//注意:这不应该每次都提取
//但只有一次,并作为一个论点通过
var blankImage=UrlFetchApp.fetch('http://upload.wikimedia.org/wikipedia/commons/d/d2/Blank.png');
//检索当前文档的正文
var doc=DocumentApp.getActiveDocument();
var docBody=doc.getBody();
//添加文本为{NotNamed}的新段落
var para=docBody.append段落('{NotNamed}');
//解决方法:
para.appendInlineImage(blankImage.getBlob());
//附加一些文本
var textElem1=para.appendText(“{NamedText1}”);
//解决方法:
para.appendInlineImage(blankImage.getBlob());
//附加一些文本
var textElem2=para.appendText(“{NamedText2}”);
//在插入文本后生成命名范围(请参见下面的注意事项)
var range1=doc.newRange().addElement(textElem1.build();
//命名范围并将其附加到文档中
文件addNamedRange(“范围1”,范围1);
var range2=doc.newRange().addElement(textElem2.build();
//命名范围并将其附加到文档中
文件addNamedRange(“范围2”,范围2);
}
执行后,文档将附加一个新段落,其中包含三个单词,由两个空白内联PNG分隔

{NotNamed}{NamedText1}{NamedText2}
执行my
getTextNamedRange()
会显示所需的行为:

Text with namedRange (Range1) : "{NamedText1}"
Text with namedRange (Range2) : "{NamedText2}"
重要注意事项:

  • 命名范围必须在最后一次插入
    文本后一起应用,否则,以前的命名范围将采用新的插入和附加

  • 无法使用
    image.removeFromParent()
    从父
    段落中删除
    InlineImages
    ,因为这会导致
    文本
    元素(以及
    NamedRange
    )再次合并


令人震惊的是,这仍然是让段落间命名范围正常工作的唯一方法。如果其他可怜的人想让它工作,你也可以使用光标函数而不是段落
cursor.insertInlineImage(blob)
->
cursor.insertText(“您的文本”)
->
cursor.insertInlineImage(blob)
。非常感谢您写下这篇文章,这篇文章仍然没有文档记录,在找到这篇文章之前,我们花了好几个小时才想出解决方案。