You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Confluence REST API实现Google Sheets URL在页面表格可点击的问题

问题描述

我正在通过Confluence REST API创建页面,页面包含从Google Sheets提取的表格,表格某一列同时包含URL和文本内容。我希望这些URL在Confluence页面上可以点击,但尝试了多种HTML标签都没生效,目前使用的是storage representation格式。相关代码如下:

Confluence HTML模板代码

<table><tr>
<th><?= col1?></th>
</tr>

<? tabledata.forEach((r,a) =>{?>
<tr style="background-color:<?= tablebackdata[a][0] ?>"><td><?= r[0]?></td></tr><?})?>
</table>

Google Apps Script代码

function confluenceCreate () {
  const ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  var ui = SpreadsheetApp.getUi();
  var result = ui.prompt("Please enter parent page link");
  var button = result.getSelectedButton();
  if (button === ui.Button.OK) {
      var pageurl = result.getResponseText()
      var TOKEN =  "dummy"
      var BASE_URL = "dummy"
      var SPACEKEY =  "dummy"
      var authHeader = 'Bearer ' + TOKEN
      var params = {
      'method' : 'get',
      'contentType': 'application/json',
      'headers' : {Authorization: authHeader},
      "muteHttpExceptions": false,
      "contentType": "application/json"
      }
      var surl = '/rest/api/content/?title='
      var eurl = '&spaceKey=GDT&expand=history'
      var purl = pageurl.split('/')
      var pname = purl [5]
      var full_link =  surl.concat(pname,eurl)
      var url1 = BASE_URL + full_link
      var response1 = UrlFetchApp.fetch(url1, params);
      var page = JSON.parse(response1).results;
      var pageid = page[0].id
      const header = ss.getRange(1,1,1,1).getValues()
      const col1 = header[0][0]
      var lr = ss.getLastRow()
      var tabledata = ss.getRange(2,1,lr,1).getValues();
      var tablebackdata = ss.getRange(2,1,lr,23).getBackgrounds();
      const htmlTemplate = HtmlService.createTemplateFromFile("confluence");
        htmlTemplate.col1 = col1;
        htmlTemplate.tabledata = tabledata;
        htmlTemplate.tablebackdata = tablebackdata;
        c = htmlTemplate.evaluate().getContent();
        var pagename = 'Test'
        var full_name =  pagename.concat(" ","criteria")
        var TOKEN = "dummy"
        var BASE_URL = "dummy"
        var SPACEKEY = "dummy"
        var authHeader = 'Bearer ' + TOKEN
        var data = {
        'type': 'page',
        'title': full_name,
        "ancestors":[{"id":pageid}],
        'space': {'key': SPACEKEY},
        'body': {'storage':{'value': c, 'representation': 'storage'}}}
         var options = {
        'method' : 'post',
        'contentType': 'application/json',
        'headers' : {Authorization: authHeader},
        'payload' : JSON.stringify(data)}
        var url = BASE_URL + '/rest/api/content'
        var response = UrlFetchApp.fetch(url, options);
    }
  Logger.log(response.getContentText());}

解决方法

核心问题是HTML模板中默认的输出语法会转义HTML标签,导致<a>无法被Confluence识别。同时需要确保URL被正确转换为可点击链接,具体修改如下:

1. 修改Confluence HTML模板

使用<?!= ?>替代<?= ?>输出未转义的HTML,同时添加URL匹配和转换逻辑:

<table>
  <tr>
    <th><?= col1 ?></th>
  </tr>
  <? tabledata.forEach((r,a) => {
    let cellContent = r[0];
    // 正则匹配单元格中的URL,转换为可点击链接
    const urlRegex = /(https?:\/\/[^\s]+)/g;
    cellContent = cellContent.replace(urlRegex, '<a href="$1">$1</a>');
  ?>
  <tr style="background-color:<?= tablebackdata[a][0] ?>">
    <td><?!= cellContent ?></td> <!-- 避免转义HTML标签 -->
  </tr>
  <? }) ?>
</table>

2. 适配Google Sheets富文本链接(可选)

如果Google Sheets单元格是插入了超链接的富文本格式,需要修改GS脚本中获取数据的逻辑,提取链接和文本:

// 替换原tabledata获取代码
var tabledata = ss.getRange(2,1,lr,1).getRichTextValues().map(row => {
  const richText = row[0];
  // 判断单元格是否包含超链接
  if (richText.getLinkUrl()) {
    return `<a href="${richText.getLinkUrl()}">${richText.getText()}</a>`;
  } else {
    return richText.getText();
  }
});

此时模板中直接输出即可:

<td><?!= r ?></td>

关键说明
  • <?= ?>会自动转义HTML字符,导致<a>标签变成纯文本,必须用<?!= ?>输出未转义内容
  • Confluence的storage格式支持标准HTML标签,只要确保内容未被转义就能正常解析
  • 若单元格是纯文本带URL,正则匹配可以自动识别并转换为链接

内容的提问来源于stack exchange,提问作者Sarvesh Ahuja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:35:22