问题描述
我想将部分字符串(通过正则表达式)转换为特定的文本样式,但我无法管理循环并且总是出错。请你帮助我好吗 ?非常感谢。
第一行是原始文本(字符串以逗号分隔),第二行是所需的文本样式。
这是工作表(法式参数)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
中,我们将用它来查找 startOffset
的 endOffset
和 setTextStyle()
值方法。
所以现在我们有:
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
数组,以确定 startOffset
和 endOffset
的值应该为 {{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 如何处理电子表格和富文本格式的细节。您需要设置自己的样式,但从您的代码来看,您似乎已经知道如何执行此操作。您问题的棘手部分是弄清楚如何识别作者子字符串,所以这就是我的回答重点。