Google apps script 如何选择段落中所有带下划线的文本

Google apps script 如何选择段落中所有带下划线的文本,google-apps-script,google-docs,Google Apps Script,Google Docs,我正在尝试创建一个谷歌应用程序脚本,它将格式化段落的某些部分。例如,带下划线的文本也将变为粗体/斜体 我尝试过的一个docs插件有一个类似的特性:这正是我想要实现的 如何编写一个函数来选择特定类型的文本并对其进行格式化 **我设法写了一个脚本,在一个段落中遍历每个字母,并检查它是否有下划线,但随着段落变长,它变得非常慢,因此我正在寻找一个更快的解决方案 函数文本下划线{ var selectedText=DocumentApp.getActiveDocument.getSelection; 如果

我正在尝试创建一个谷歌应用程序脚本,它将格式化段落的某些部分。例如,带下划线的文本也将变为粗体/斜体

我尝试过的一个docs插件有一个类似的特性:这正是我想要实现的

如何编写一个函数来选择特定类型的文本并对其进行格式化

**我设法写了一个脚本,在一个段落中遍历每个字母,并检查它是否有下划线,但随着段落变长,它变得非常慢,因此我正在寻找一个更快的解决方案

函数文本下划线{ var selectedText=DocumentApp.getActiveDocument.getSelection; 如果选择了文本{ var elements=selectedText.getRangeElements; 对于var指数=0;指数根据动画gif中显示的示例,您的过程似乎需要

处理选择 如果所选区域采用某种格式(例如下划线),则设置属性 如果所选区域不是某种格式(例如未加下划线),则设置属性 尽快完成 您的示例代码实现了除最后一个目标之外的所有这些目标

问题是您正在调用text.set。。。每个索引位置的函数。每个调用都是同步的,并在文档更新之前阻塞代码,因此您的运行时间随着选择中的每个字符线性增长

我的建议是从选择范围建立一个子范围集合,然后为每个子范围使用text.set…subrange.start,subrange.end来应用格式。现在,运行时间将取决于字符块,而不是单个字符。i、 例如,仅当格式在示例中从带下划线切换到不带下划线时才会更新

下面是一些实现此子范围思想的示例代码。我将特定的谓词函数text.isUnderline和特定的格式化效果分离为各自的函数,以便将总体思路与具体实现分开

//通过选择运行此函数 函数转换为带下划线的黄色和黄色{ 变革选择下划线、粗体黄色或小字体; } 函数转换选择StylePredicateKey,StyleingFunction{ const selectedText=DocumentApp.getActiveDocument.getSelection; 如果!选择文本返回; const getStyledSubRanges=makeStyledSubRangeReducerstylePredicateKey; selectedText.getRangeElements .reducegetStyledSubRanges,[] .foreachStyleingFunction; } 函数makeStyledSubRangeReducerstylePredicateKey{ 返回函数范围,范围元素{ 常量{text,start,end}=unwarangeElementRangeElement; 如果开始>=结束返回范围;//过滤掉空选择 常数范围={ 文本,开始,结束, 已设置样式:[],未设置样式:[//我们将使用子范围扩展我们的范围 }; const getKey=isStyled=>isStyled?styled:notStyled; 让currentKey=getKeytext[stylePredicateKey]开始; 范围[currentKey]。取消移位{start:start}; 对于let index=start+1;索引{text,start,end} 函数UnwapRangeElement RangeElement{ 常量isPartial=rangeElement.isPartial; const text=rangeElement.getElement.asText; 返回{ 文本:文本, 开始:iPartial ?rangeElement.getStartOffset : 0, 完:i部分 ?rangeElement.getEndOffsetInclusive :text.getText.length-1 }; } //应用特定格式以满足示例要求 函数boldyellowsmalrange{ const{text,start,end,styled,notStyled}=range; styled.foreach函数setTextBoldAndYellowrange{ text.setBoldrange.start,range.end | | end,true; text.setBackgroundColorrange.start,range.end | | end,“ffff00”; }; notStyled.forEachfunction setTextSmallrange{ text.setFontSizerange.start,range.end | | end,8; }; }
根据动画gif中显示的示例,您的过程似乎需要

处理选择 如果所选区域采用某种格式(例如下划线),则设置属性 如果所选区域不是某种格式(例如未加下划线),则设置属性 尽快完成 您的示例代码实现了除最后一个目标之外的所有这些目标

问题是您正在调用文本。在每个索引位置设置…函数。每个调用都是同步的,并阻止代码运行 直到文档被更新,您的运行时间将随着选择中的每个字符线性增长

我的建议是从选择范围建立一个子范围集合,然后为每个子范围使用text.set…subrange.start,subrange.end来应用格式。现在,运行时间将取决于字符块,而不是单个字符。i、 例如,仅当格式在示例中从带下划线切换到不带下划线时才会更新

下面是一些实现此子范围思想的示例代码。我将特定的谓词函数text.isUnderline和特定的格式化效果分离为各自的函数,以便将总体思路与具体实现分开

//通过选择运行此函数 函数转换为带下划线的黄色和黄色{ 变革选择下划线、粗体黄色或小字体; } 函数转换选择StylePredicateKey,StyleingFunction{ const selectedText=DocumentApp.getActiveDocument.getSelection; 如果!选择文本返回; const getStyledSubRanges=makeStyledSubRangeReducerstylePredicateKey; selectedText.getRangeElements .reducegetStyledSubRanges,[] .foreachStyleingFunction; } 函数makeStyledSubRangeReducerstylePredicateKey{ 返回函数范围,范围元素{ 常量{text,start,end}=unwarangeElementRangeElement; 如果开始>=结束返回范围;//过滤掉空选择 常数范围={ 文本,开始,结束, 已设置样式:[],未设置样式:[//我们将使用子范围扩展我们的范围 }; const getKey=isStyled=>isStyled?styled:notStyled; 让currentKey=getKeytext[stylePredicateKey]开始; 范围[currentKey]。取消移位{start:start}; 对于let index=start+1;索引{text,start,end} 函数UnwapRangeElement RangeElement{ 常量isPartial=rangeElement.isPartial; const text=rangeElement.getElement.asText; 返回{ 文本:文本, 开始:iPartial ?rangeElement.getStartOffset : 0, 完:i部分 ?rangeElement.getEndOffsetInclusive :text.getText.length-1 }; } //应用特定格式以满足示例要求 函数boldyellowsmalrange{ const{text,start,end,styled,notStyled}=range; styled.foreach函数setTextBoldAndYellowrange{ text.setBoldrange.start,range.end | | end,true; text.setBackgroundColorrange.start,range.end | | end,“ffff00”; }; notStyled.forEachfunction setTextSmallrange{ text.setFontSizerange.start,range.end | | end,8; }; } 使用GetTextAttributeIndicates: 无需检查所选内容中的每个字符。您可以使用获取文本格式更改的索引。此方法:

检索与不同文本格式运行的开始相对应的文本索引集

您只需要迭代这些索引,即检查文本格式发生更改的索引,这些索引只占所有字符索引的一小部分。这将大大提高效率

代码示例: 函数文本下划线{ var selectedText=DocumentApp.getActiveDocument.getSelection; 如果选择了文本{ var elements=selectedText.getRangeElements; 对于var指数=0;指数 检索与不同文本格式运行的开始相对应的文本索引集

您只需要迭代这些索引,即检查文本格式发生更改的索引,这些索引只占所有字符索引的一小部分。这将大大提高效率

代码示例: 函数文本下划线{ var selectedText=DocumentApp.getActiveDocument.getSelection; 如果选择了文本{ var elements=selectedText.getRangeElements; 对于var指数=0;指数你能和大家分享一下脚本吗?它会循环遍历每个字母,看看是否有下划线?有必要吗?我只是想知道如何从段落中选择特定文本,就像imgur gif I linkeds一样。你想要什么,而你对共享不感兴趣吗?欢迎来到StackOverFlow。请借此机会学习如何,你有没有正在编写的代码?如果你展示了你所尝试的,更多的人会愿意帮助你。你能分享一下脚本吗?它会反复遍历每个字母,看看是否有下划线?这是必要的吗?我只是想知道如何从段落中选择特定文本,就像imgur gif I linkeds一样。你想要什么,而你对共享不感兴趣吗?欢迎来到StackOverFlow。请借此机会学习如何,你有没有正在编写的代码?如果你表现出你的努力,更多的人会愿意帮助你。