如何在Google Apps Script中仅格式化createTextFinder匹配的文本而非整单元格?
仅格式化单元格内匹配的文本片段(而非整个单元格)
现有Google Apps Script函数会在C5:C23区域找到包含指定文本的单元格,并为整个单元格设置格式,但我们需要只格式化单元格内匹配的文本内容(比如匹配"Second"时,仅给"Second"设置样式,而非整个"Second thing"单元格),可以通过以下方式实现:
修改后的函数代码
function findAndSetTextStyle(textToFind, format){ const sheet = SpreadsheetApp.getActive(); const ranges = sheet.getRange('C5:C23') .createTextFinder(textToFind) .matchEntireCell(false) .matchCase(false) .matchFormulaText(false) .ignoreDiacritics(true) .findAll(); ranges.forEach(range => { const cellText = range.getValue().toString(); const richText = range.getRichTextValue().copy(); const textLength = textToFind.length; let startIndex = cellText.indexOf(textToFind); // 处理单元格内存在多个匹配文本的情况 while (startIndex !== -1) { richText.setTextStyle(startIndex, startIndex + textLength, format); startIndex = cellText.indexOf(textToFind, startIndex + textLength); } range.setRichTextValue(richText); }); }
代码说明
- 利用
getRichTextValue()获取单元格的富文本对象,通过copy()创建副本避免直接修改原数据 - 通过
indexOf()循环定位文本中所有匹配textToFind的起始位置 - 对每个匹配的文本区间(从起始索引到起始索引+匹配文本长度),应用传入的
format样式 - 最后通过
setRichTextValue()将修改后的富文本写回单元格,实现仅指定文本片段格式化的效果
使用示例
如果要给匹配的文本设置红色加粗样式,可按如下方式调用函数:
const highlightFormat = SpreadsheetApp.newTextStyle() .setBold(true) .setForegroundColor('#ff0000') .build(); findAndSetTextStyle("Second", highlightFormat);
内容的提问来源于stack exchange,提问作者chelder
相关产品推荐
相关产品推荐

