通过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
相关产品推荐
相关产品推荐

