setRichTextValue 到数组中的元素而不是一次一个单元格?
setRichTextValue to elements in an array instead of one cell at a time?
我想为电子表格中的一列值创建超链接(有时,每个单元格 2 个超链接)。我设法使用以下代码成功地做到了这一点:
function makeJiraLinks() {
let ss = SpreadsheetApp.getActive();
let sheet = ss.getSheetByName('testing');
let data = sheet.getDataRange().getValues();
// Get 1-indexed column
let col = 1 + data[0].indexOf('Jira ids');
if (col == 0) {
return;
}
for (let row = 1; row <= sheet.getMaxRows(); ++row) {
let range = sheet.getRange(row, col);
let text = '' + range.getValue();
if (text.indexOf("TTSD-") === -1) {
continue;
}
let builder = SpreadsheetApp.newRichTextValue();
builder.setText(text);
let re = /TTSD-\d+/g;
let result;
while (result = re.exec(text)) {
let startIndex = result.index;
let endIndex = startIndex + result[0].length;
builder.setLinkUrl(startIndex, endIndex, 'https://jira.tools/browse/' + result[0]);
}
range.setRichTextValue(builder.build());
}
}
我不喜欢这段代码的地方在于它效率低下,因为它逐一推进范围并且 运行 getValue() 的次数与列中的行数一样多。
我想要什么: 有什么方法可以将整个列作为数组并直接将富文本应用于它所以我只调用一次 getValues() 和 setValues( ) 一次?
谢谢!
我相信你的目标如下。
- 您想检索第 1 行 header 为
Jira ids
的列。
- 您想在检索到的行中提供指向
TTSD-\d+
文本的超链接。
- 您想减少脚本的处理成本。
修改点:
- 为了达到你的目的,我建议使用
getRichTextValues()
和setRichTextValues(values)
。当使用这些方法时,我认为工艺成本会降低。
- Class RichTextValue 有
getText()
的方法。这样,也可以检索单元格值。因此,在这种情况下,不需要使用 getValues
和 setValues
。
- Class RichTextValue 有
copy()
的方法。这样就可以在不改变原文样式的情况下添加超链接。
当以上几点反映到你的脚本中,就变成了下面这样。
修改后的脚本:
function makeJiraLinks() {
let ss = SpreadsheetApp.getActive();
let sheet = ss.getSheetByName('testing');
let [header, ...data] = sheet.getDataRange().getRichTextValues();
let col = header.map(h => h.getText()).indexOf('Jira ids');
let builders = data.map(r => {
let text = r[col].getText();
if (text.includes("TTSD-")) {
let builder = r[col].copy();
let re = /TTSD-\d+/g;
let result;
while (result = re.exec(text)) {
let startIndex = result.index;
let endIndex = startIndex + result[0].length;
builder.setLinkUrl(startIndex, endIndex, 'https://jira.tools/browse/' + result[0]);
}
return [builder.build()];
}
return [r[col]];
});
sheet.getRange(2, col + 1, builders.length, 1).setRichTextValues(builders);
}
注:
- 在这个修改后的脚本中,请使用启用V8。
参考文献:
我想为电子表格中的一列值创建超链接(有时,每个单元格 2 个超链接)。我设法使用以下代码成功地做到了这一点:
function makeJiraLinks() {
let ss = SpreadsheetApp.getActive();
let sheet = ss.getSheetByName('testing');
let data = sheet.getDataRange().getValues();
// Get 1-indexed column
let col = 1 + data[0].indexOf('Jira ids');
if (col == 0) {
return;
}
for (let row = 1; row <= sheet.getMaxRows(); ++row) {
let range = sheet.getRange(row, col);
let text = '' + range.getValue();
if (text.indexOf("TTSD-") === -1) {
continue;
}
let builder = SpreadsheetApp.newRichTextValue();
builder.setText(text);
let re = /TTSD-\d+/g;
let result;
while (result = re.exec(text)) {
let startIndex = result.index;
let endIndex = startIndex + result[0].length;
builder.setLinkUrl(startIndex, endIndex, 'https://jira.tools/browse/' + result[0]);
}
range.setRichTextValue(builder.build());
}
}
我不喜欢这段代码的地方在于它效率低下,因为它逐一推进范围并且 运行 getValue() 的次数与列中的行数一样多。
我想要什么: 有什么方法可以将整个列作为数组并直接将富文本应用于它所以我只调用一次 getValues() 和 setValues( ) 一次?
谢谢!
我相信你的目标如下。
- 您想检索第 1 行 header 为
Jira ids
的列。 - 您想在检索到的行中提供指向
TTSD-\d+
文本的超链接。 - 您想减少脚本的处理成本。
修改点:
- 为了达到你的目的,我建议使用
getRichTextValues()
和setRichTextValues(values)
。当使用这些方法时,我认为工艺成本会降低。 - Class RichTextValue 有
getText()
的方法。这样,也可以检索单元格值。因此,在这种情况下,不需要使用getValues
和setValues
。 - Class RichTextValue 有
copy()
的方法。这样就可以在不改变原文样式的情况下添加超链接。
当以上几点反映到你的脚本中,就变成了下面这样。
修改后的脚本:
function makeJiraLinks() {
let ss = SpreadsheetApp.getActive();
let sheet = ss.getSheetByName('testing');
let [header, ...data] = sheet.getDataRange().getRichTextValues();
let col = header.map(h => h.getText()).indexOf('Jira ids');
let builders = data.map(r => {
let text = r[col].getText();
if (text.includes("TTSD-")) {
let builder = r[col].copy();
let re = /TTSD-\d+/g;
let result;
while (result = re.exec(text)) {
let startIndex = result.index;
let endIndex = startIndex + result[0].length;
builder.setLinkUrl(startIndex, endIndex, 'https://jira.tools/browse/' + result[0]);
}
return [builder.build()];
}
return [r[col]];
});
sheet.getRange(2, col + 1, builders.length, 1).setRichTextValues(builders);
}
注:
- 在这个修改后的脚本中,请使用启用V8。