如何编程多次调用RichTextValueBuilder.setTextStyle()批量设置富文本样式?
问题描述
我需要将单元格中符合\([ a-zA-Z\/']*\)\?格式的文本设置为红色加粗的富文本样式,编写测试代码后首次运行仅最后一个匹配项应用了样式。经查证,问题出在每次循环都新建RichTextValueBuilder并调用setText(),而setText()会清除所有已有样式。现在希望能根据单元格中0-10个不等的匹配项批量设置样式,无需为不同匹配数量创建多个Builder实例。
解决方案
核心思路是只创建一个RichTextValueBuilder实例,先一次性设置基础文本,再循环为每个匹配项添加样式,最后一次性将构建好的富文本值应用到单元格。
修正后的代码如下:
function test2() { const ss = SpreadsheetApp.getActive(); const sheet = ss.getSheetByName("richText3"); const range1 = sheet.getRange("A1"); const text1 = range1.getValue(); const re = new RegExp(/\([ a-zA-Z\/']*\)\?/dg); const redBold = SpreadsheetApp.newTextStyle().setBold(true).setForegroundColor('red').build(); // 初始化Builder并设置基础文本(仅执行一次) const richTxtValBlder = SpreadsheetApp.newRichTextValue().setText(text1); // 遍历所有匹配项,累积添加样式 let array; while ((array = re.exec(text1)) !== null) { const [start, end] = array.indices[0]; richTxtValBlder.setTextStyle(start, end, redBold); } // 生成最终富文本并应用到单元格 range1.setRichTextValue(richTxtValBlder.build()); }
关键说明
- 避免重复创建Builder:只初始化一次
RichTextValueBuilder,setText(text1)仅调用一次,不会清除已添加的样式 - 样式累积:循环中每次调用
setTextStyle()都会在现有样式基础上新增匹配段的样式,所有修改都在同一个实例上完成 - 批量应用:最后通过
build()生成完整的富文本对象,一次性赋值给单元格,确保所有匹配项的样式都生效
内容的提问来源于stack exchange,提问作者hong
相关产品推荐
相关产品推荐

