将文本样式应用于谷歌工作表单元格中的正则表达式模式

问题描述

我想将部分字符串(通过正则表达式)转换为特定的文本样式,但我无法管理循环并且总是出错。请你帮助我好吗 ?非常感谢。

第一行是原始文本(字符串以逗号分隔),第二行是所需的文本样式。

enter image description here

这是工作表(法式参数)https://docs.google.com/spreadsheets/d/1vq0Ai_wEr3MamEQ-kMsXW7ZGg3RxrrkE5lITcYjO-rU/edit?usp=sharing

$var0

解决方法

这里的一个问题是作者姓名有时用逗号分隔,有时仅用空格分隔。请参阅 Ten.,Benth.,Swart,(Ten.) Kerguélen。但是,在您的评论中,您说这种情况并不经常发生,您可以手动处理此问题,因此我们暂时假设作者姓名永远不会以逗号分隔。

假设,我们可以通过,分割每个单元格的内容,分别处理每个植物名称/作者:

const plants = text.split(',')

for (const plant of plants) {
  // Find start/end of authors substring.
}

我们需要的是找到“植物作者”子字符串开始和结束的索引。

查找植物作者子串的结束索引很容易;它只是整个植物字符串的结尾:

const end = plant.length

要找到植物作者子串的开头,我们可以查找空格 ' ' 的索引。 (您需要为此编写自己的 getIndices() 方法。)如果植物包含 subsp.var.,则起始索引是第 4 个空格;否则,它是第二个空格:

let start
spaceIndices = getIndices(plant,' ')
if (plant.includes('subsp.') || plant.includes('var.')) start = spaceIndices[3] + 1  // Add 1 to not include the space itself
else start = spaceIndices[1] + 1  // Add 1 to not include the space itself

一旦我们有了开始/结束索引,我们就可以将它们放在一个数组 offsets 中,我们将用它来查找 startOffsetendOffsetsetTextStyle() 值方法。

所以现在我们有:

const plants = text.split(',')
let offsets = []
for (const plant of plants) {
  const end = plant.length
  
  let start
  spaceIndices = getIndices(plant,' ')
  if (plant.includes('subsp.') || plant.includes('var.')) start = spaceIndices[3] + 1
  else start = spaceIndices[1] + 1

  offsets.push({
    start,end
  })
}

接下来,我们必须启动 RichTextValueBuilder 对象并循环遍历 offsets 数组,以确定 startOffsetendOffset 的值应该为 {{1} } 方法通过添加我们之前找到的 where setTextStyles()start 值来索引

end

最后,构建 let richText = SpreadsheetApp.newRichTextValue() .setText(text) let authorTextStyle = SpreadsheetApp.newTextStyle() .setBold(true) .build() let plantStartIndex = 0 for (const offset of offsets) { const startOffset = plantStartIndex + offset.start const endOffset = plantStartIndex + offset.end richText = richText.setTextStyle(startOffset,endOffset,authorTextStyle) plantStartIndex = plantStartIndex + offset.end + 2 // Add 2 to not include the "," separator } 对象:

RichTextValue

...并将其与您的其余代码结合在一起:

richText = richText.build()

我跳过了许多有关 Apps Script API 如何处理电子表格和富文本格式的细节。您需要设置自己的样式,但从您的代码来看,您似乎已经知道如何执行此操作。您问题的棘手部分是弄清楚如何识别作者子字符串,所以这就是我的回答重点。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...