setRichTextValue 设置为数组中的元素而不是一次一个单元格?

jlo*_*jlo 1 google-sheets richtext google-apps-script

我在电子表格中有一列值,我想为其创建超链接(有时,每个单元格有 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());
  }
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢这段代码的地方是它效率低下,因为它逐一推进范围并运行 getValue() 次数与列中的行一样多。

我想要什么:有什么方法可以将整个列作为数组获取并直接对其应用富文本,这样我只需调用 getValues() 一次和 setValues() 一次?

谢谢!

Tan*_*ike 5

我相信你的目标如下。

  • Jira ids您想要检索第一行具有标题的列。
  • TTSD-\d+您想要为检索到的行中的文本提供超链接。
  • 您希望减少脚本的处理成本。

修改要点:

  • 为了实现您的目标,我想建议使用getRichTextValues()setRichTextValues(values)。当使用这些方法时,我认为工艺成本将会降低。
  • RichTextValue 类具有 方法getText()。这样,也可以检索单元格值。因此,在这种情况下,不需要使用getValues和。setValues
  • 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);
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 在此修改后的脚本中,请在启用 V8 的情况下使用。

参考: