06
2022
02

Highlight search font in google sheet (Update in 29/03/2022)

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var rangeData = sheet.getDataRange();
var lastColumn = rangeData.getLastColumn();
var lastRow = rangeData.getLastRow();
var searchRange = sheet.getRange(1,1lastRowlastColumn);

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu2 = ui.createMenu("螢光'文字'")
  .addItem('Red Font''Highlight_FontRed')
  .addItem('Orange Font''Highlight_FontOrange')
  .addItem('Yellow Font''Highlight_FontYellow')
  .addItem('Green Font''Highlight_FontGreen')
  .addItem('Aqua Font''Highlight_FontAqua')
  .addItem('Blue Font''Highlight_FontBlue'
  .addItem('Purple Font''Highlight_FontPurple')
  .addItem('Pink Font''Highlight_FontPink')
  .addItem('Flesh Font''Highlight_FontFlesh')
  .addItem('Magenta Font''Highlight_FontMagenta')
  .addItem('Brown Font''Highlight_FontBrown')
  .addItem('Grey Font''Highlight_FontGrey')
  .addItem('Black Font''Highlight_FontBlack')  
  menu2.addToUi();

}


function Highlight_FontBrown () {
  set_Font_Colour("brown")
}
 
function Highlight_FontGreen () {
  set_Font_Colour("green")
}
 
function Highlight_FontPurple () {
  set_Font_Colour("purple")
}
 
function Highlight_FontYellow () {
  set_Font_Colour("#999900")
}
 
function Highlight_FontPink () {
  set_Font_Colour("#ff33ff")
}
 
function Highlight_FontAqua () {
  set_Font_Colour("#29a3a3")
}
 
function Highlight_FontRed () {
  set_Font_Colour("red")
}
 
function Highlight_FontOrange () {
  set_Font_Colour("orange")
}
 
function Highlight_FontBlack () {
  set_Font_Colour("black")
}
 
function Highlight_FontBlue () {
  set_Font_Colour("blue")
}
 
function Highlight_FontFlesh () {
  set_Font_Colour("#ffb3b3")
}
 
function Highlight_FontMagenta () {
  set_Font_Colour("#cc0052")
}
 
function Highlight_FontGrey () {
  set_Font_Colour("#737373")
}
 
function set_Font_Colour(colorCode) {
  var word =  SpreadsheetApp.getUi().prompt("Please enter the find word").getResponseText()
 
  if(!word.trim().length)
    return;                                                                                                                   ;
 
  var start_time = parseInt(new Date().getTime())
 
  
 
  var regWord = word.split("").map(item => /[\\`~!@#$%^*"'()_\-+?:{},.\/;[\]]/.test(item)? "\\"+item : item).join("")
  var reg = new RegExp(regWord,"i")
 
  var colorCodeArray = new Array(word.length).fill(colorCode0this.length)
 
  var lastRow = sheet.getLastRow()
  var lastColumn = sheet.getLastColumn()
  var range = sheet.getRange(11lastRowlastColumn)

  var allData = range.getDisplayValues()
  
  var original_format = range.getNumberFormats()
  var string_format = original_format.map(row => row.map(cell => '@'))
  range.setNumberFormats(string_format);
 
  var richTextValues = range.getRichTextValues()

  //range.setNumberFormats(original_format)
  //SpreadsheetApp.flush()

  var Index = []
  for(var column = 0column < lastColumncolumn++) {
    for(var row = 0row < lastRowrow++) {
      if(reg.test(allData[row][column])){
        Index.push([rowcolumn])
      }     
    }
  }
 

  data = Index.map(item => getTextStyle_in_cell(allDatarichTextValuesitem[0], item[1]))
  
 
  
  var newTextStyle = data.map(style => findWordsAndCombineTextStyle(stylewordregWordcolorCodeArray))
  
  var total = setTextStyle_in_cell(newTextStyle)
  
  range.setNumberFormats(original_format)

  
  
  var TimeUsed = (parseInt(new Date().getTime()- start_time)/1000).toString()
  
SpreadsheetApp.getUi().alert("Total: "+total+' for "'+word+'"\n時間用了'+time_used+"秒。")
}
 
function getTextStyle_in_cell(allDatarichTextValuesrowcolumn){
  var obj = {}
  
  obj.row = row
  obj.column = column
  obj.cellValue = allData[row][column]
  obj.textlength = obj.cellValue.length
  
  obj.color = new Array(obj.textlength)
  obj.isBold = new Array(obj.textlength)
  obj.isUnderline = new Array(obj.textlength)
  obj.isItalic = new Array(obj.textlength)
  obj.isStrikethrough = new Array(obj.textlength)
  obj.fontFamily = new Array(obj.textlength)
  obj.fontSize = new Array(obj.textlength)
  
  var runs = richTextValues[row][column].getRuns();
  for(var i=0i<runs.lengthi++) {
    var run = runs[i]
    var style = run.getTextStyle();
    var start = run.getStartIndex()
    var end = run.getEndIndex() 

    obj.color.fill(style.getForegroundColor(), startend)
    obj.isBold.fill(style.isBold(), startend)
    obj.isUnderline.fill(style.isUnderline(), startend)
    obj.isItalic.fill(style.isItalic(), startend)
    obj.isStrikethrough.fill(style.isStrikethrough(), startend)
    obj.fontFamily.fill(style.getFontFamily(), startend)
    obj.fontSize.fill(style.getFontSize(), startend)
  }
  
  return obj;
}
 
function findWordsAndCombineTextStyle(objwordregWordcolorCodeArray) {
  obj.newIndex = []
  obj.count = 0
 
  var reg = new RegExp(regWord,"ig")
  var start;
  while(start = reg.exec(obj.cellValue)){
    obj.count++
    obj.color.splice(start.indexword.length, ...colorCodeArray)
  }
  
  var count = []
  for(var j=0j<obj.textlength;) {
    count.push(j)
 
    if(isTextStyleEqual(jobj"color""isBold""isUnderline""isItalic""isStrikethrough""fontFamily""fontSize")) {
      j++
      continue
    }
 
    obj.newIndex.push([count[0], count.pop()+1])
    
    j++
    count.length = 0;
  }
  return obj;
}
 
function isTextStyleEqual(...args) {
  var index = args[0]
  var information = args[1]
  
  for(var i=2i<args.lengthi++) {
    if(information[args[i]][index] != information[args[i]][index+1]) {
      return false
    }
  }
  return true
}
 
function setTextStyle_in_cell(data) {
  var rich = data.map(item => SpreadsheetApp.newRichTextValue().setText(item.cellValue))
 
  data.forEach((informationi) => {
 
    information.newIndex.forEach(item => {
      var start = item[0]
      var end = item[1]
      var style = SpreadsheetApp.newTextStyle()
                   .setForegroundColor(information.color[start])
                   .setBold(information.isBold[start])
                   .setUnderline(information.isUnderline[start])
                   .setItalic(information.isItalic[start])
                   .setStrikethrough(information.isStrikethrough[start])
                   .setFontFamily(information.fontFamily[start])
                   .setFontSize(information.fontSize[start])
                   .build();
      
      rich[i].setTextStyle(startendstyle)
    })
    
  })
 
  data.forEach((itemj) => sheet.getRange(item.row+1item.column+1).setRichTextValue(rich[j].build()))
 
  return data.map(item => item.count).reduce((prevcurr) => prev + curr);
}
  


  



« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。