Google表格中的粗体特定文本[重复]

Posted

技术标签:

【中文标题】Google表格中的粗体特定文本[重复]【英文标题】:Bold specific text in Google Sheets [duplicate] 【发布时间】:2021-10-28 07:41:44 【问题描述】:

以下 VBA 代码将包含特定短语的单元格加粗。我可以在 Google 表格中使用具有类似输出的东西吗?

Sub FindAndBold()
Dim I As Long
Dim xFind As String
Dim xCell As Range
Dim xTxtRg As Range
Dim xCount As Long
Dim xLen As Integer
Dim xStart As Integer
Dim xRg As Range, xRgFind As Range
Dim xTxt As String
Dim xArr() As String
On Error Resume Next
If ActiveWindow.RangeSelection.Count > 1 Then
xTxt = ActiveWindow.RangeSelection.AddressLocal
Else
xTxt = ActiveSheet.UsedRange.AddressLocal
End If
Set xRg = Application.InputBox("Please select data range:", "Kutools for Excel", xTxt, , , , , 8)
If xRg Is Nothing Then Exit Sub
On Error Resume Next
Set xTxtRg = Application.Intersect(xRg.SpecialCells(xlCellTypeConstants, xlTextValues), xRg)
If xTxtRg Is Nothing Then
MsgBox "There are no cells with text"
Exit Sub
End If
Set xRgFind = Application.InputBox("Select the text cells you want to bold", "Kutools for Excel", , , , , , 8)
If xRgFind Is Nothing Then
MsgBox "No text was listed", vbInformation, "Kutools for Excel"
Exit Sub
End If
ReDim xArr(xRgFind.Count - 1)
For I = 0 To (xRgFind.Count - 1)
xArr(I) = xRgFind(I + 1)
Next
For Each xCell In xTxtRg
For I = 0 To UBound(xArr)
xFind = Trim(xArr(I))
xStart = InStr(xCell.Value, xFind)
xLen = Len(xFind)
Do While xStart > 0
xCell.Characters(xStart, xLen).Font.Bold = True
xCount = xCount + 1
xStart = InStr(xStart + xLen, xCell.Value, xFind)
Loop
Next
Next
If xCount > 0 Then
MsgBox "number of " & CStr(xCount) & " text be bolded!", vbInformation, "Kutools for Excel"
Else
MsgBox "Not find the specific text!", vbInformation, "Kutools for Excel"
End If
End Sub

例如,让 B1 单元格中的文本“手机 A5225” 芽我只想加粗这个单元格中的一个特定单词,让我们说“电话”,所以输出将是:“移动 电话 A5525” 加粗的单词列表将是 A1:A50

【问题讨论】:

欢迎来到Stack Overflow。考虑共享一个可公开编辑的sample spreadsheet,其中包含逼真的数据,并在那里显示您手动输入的预期结果。 【参考方案1】:

您可以使用RichTextValueBuilder。 这是一个基于您的 VBA 脚本的示例。

function FindAndBold()
  var ui = SpreadsheetApp.getUi();
  var search = ui.prompt("Input the text you want to bold").getResponseText();
  var rangeStr = ui.prompt("Input the target range (e.g. A1:C6)").getResponseText();
  var range = SpreadsheetApp.getActive().getRange(rangeStr);
  var values = range.getValues();
  var bold = SpreadsheetApp.newTextStyle().setBold(true).build();
  var count = 0;

  for ( var i = 0; i < values.length; i++ )
    for ( var j = 0; j < values[i].length; j++ )
      var value = values[i][j];
      var newValue = null;
      var start = value.indexOf(search);
      while( start >= 0 )
        if(newValue == null)
          newValue = SpreadsheetApp.newRichTextValue().setText(value.toString());
        
        newValue.setTextStyle(start, start + search.length, bold);
        start = value.indexOf(search, start + search.length);
        count++;
      

      if(newValue != null)
        var cell = range.getCell(i+1, j+1);
        cell.setRichTextValue(newValue.build());
      
    
  
  if( count > 0 )
    ui.alert("number of " + count + " text be bolded!");
  
  else
    ui.alert("Not find the specific text!");
  

希望这会有所帮助。?

【讨论】:

非常感谢!!!是否有可能有我想要加粗的文本范围,而不是输入它?例如,我想加粗的单词将在 B1:B50 中,将加粗目标范围 A1:A100【参考方案2】:

这当然可以在Google Apps Script 中完成,但使用conditional formatting 会简单得多。

要突出显示单元格A1 中的短语作为Apply to range 单元格的一部分出现的单元格,请使用如下条件格式规则:

Text contains=$A$1

条件格式只能格式化整个单元格。要突出显示单元格中的部分短语,请使用此 Apps 脚本函数:

/**
* Formats text strings so that a chosen phrase is bold blue.
* Handles multiple occurrences of the phrase in each cell.
* Ignores cells with numeric values such as 123.45 or 10/28/2021.
* Overwrites formulas with the values as shown in the cell.
*/
function formatPhraseInText() 
  // version 1.2, written by --Hyde, 28 October 2021
  //  - see https://***.com/a/69750237/13045193
  const range = SpreadsheetApp.getActiveRange();
  const ui = SpreadsheetApp.getUi();
  const response = ui.prompt('Enter the text you want to bold in ' + range.getA1Notation() + ':');
  const text = response.getResponseText();
  if (response.getSelectedButton() !== ui.Button.OK || !text) 
    return;
  ;
  const regex = new RegExp(text.replace(/[.*+?^$()|[\]\\]/g, '\\$&'), 'gi');
  const format = SpreadsheetApp.newTextStyle().setBold(true).setForegroundColor('blue').build();
  const values = range.getDisplayValues();
  let match;
  const formattedText = values.map(row => row.map(value => 
    const richText = SpreadsheetApp.newRichTextValue().setText(value);
    while (match = regex.exec(value)) 
      richText.setTextStyle(match.index, match.index + match[0].length, format);
    
    return richText.build();
  ));
  range.setRichTextValues(formattedText);

要添加自定义菜单项来运行函数,请添加 onOpen(e) 函数并重新加载电子表格:

/**
* Simple trigger that runs each time the user opens the
* spreadsheet.
*
* Adds a menu item to highlight a phrase.
*
* @param Object e The onOpen() event object.
* @OnlyCurrentDoc
*/
function onOpen(e) 
  SpreadsheetApp.getUi()
    .createMenu('Highlight')
    .addItem('Highlight a phrase', 'formatPhraseInText')
    .addToUi();

要使用regular expressions 匹配更复杂的模式,请将const regex 行替换为:

  const regex = new RegExp(text, 'gi');

Google Apps 脚本使用javascript regular expressions。

【讨论】:

这将加粗整个单元格,但我只想加粗该单元格中的特定文本。抱歉,我之前可能没有指定,也编辑过帖子。 编辑了答案以包含一个应用脚本实现,该实现突出显示单元格中的部分文本。 非常感谢!!!是否有可能有我想要加粗的文本范围,而不是输入它?例如,我想加粗的单词将在 B1:B50 中,将加粗目标范围 A1:A100 是的,但这不是这个问题的意义所在。请仅询问one question per post。

以上是关于Google表格中的粗体特定文本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从Google电子表格中解析格式化文本

Google Chrome 中的粗体字体模糊(@Font-Face)

textView 中的粗体/斜体样式文本输入

MFC 中的粗体标签

contentEditable div 中的粗体选定文本,使用纯 JavaScript,不使用 jQuery 等库

文本块失去粗体文本的粗体