谷歌表格脚本获取单元格超链接。

5

我正在尝试获取一组单元格的URL,但是getLinkUrl始终返回null

这是我尝试过的:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Liste");
var url = sheet.getRange("A1").getRichTextValue().getLinkUrl();

这将返回:null
var test = sheet.getRange("A1").getRichTextValue().getText(); 

这将返回:text(它是A1单元格中的文本,所以它有效,然后我尝试了)。
var test2 = sheet.getRange("A1").getRichTextValue().getLinkUrl(); 

这将返回:null(我不理解为什么,所以尝试了这个)。
var test3 = sheet.getRange("A1:A10").getRichTextValues(); 

这将返回:

[ [ {} ],
  [ {} ],
  [ {} ],
  [ {} ],
  [ {} ],
  [ {} ],
  [ {} ],
  [ {} ],
  [ {} ],
  [ {} ] ]

我很困惑,不知道如何获取一个/多个单元格的URL。

在文档中,有一个关于getLinkUrl的解释,如果有多个URL,则返回null,但我不知道如何仅提取一个URL。

我正在处理的工作表非常简单,只有A列中有文字。

appli
info
motivation
anime
dev perso
reflexion
funny
sad

你能提供一个我们可以编辑的链接样本吗?谢谢。 - David Leal
很抱歉,我不明白您需要什么。如果这是关于表格的事情,我只有A列中的单词列表: 应用 信息 动机 动漫 个人开发 反思 有趣的 悲伤的 - Madar
您可以使用getFormula()函数,它会返回类似于“=HYPERLINK(<link>)”的内容,然后您可能可以在那里提取链接。请分享您的表格副本以获取有关您关注的更多详细信息。 - Jason E.
1个回答

4

虽然我不确定你实际使用的是哪个电子表格,但从“我试图获取一组单元格的url,但它总是返回null”这句话中,我想在你的情况下,超链接可能设置在单元格文本的某个部分。因此,你可以尝试以下示例脚本:

示例脚本:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Liste");
var res = sheet
  .getRange("A1")
  .getRichTextValue()
  .getRuns()
  .reduce((ar, e) => {
    var url = e.getLinkUrl();
    if (url) ar.push({url: url, text: e.getText()});
    return ar;
  }, []);
console.log(res)

或者,如果您想从多个单元格中检索URL,您也可以使用以下脚本。
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Liste");
var res = sheet
  .getRange("A1:A10")
  .getRichTextValues()
  .map((r, i) =>
    r.flatMap((c, j) =>
      c.getRuns().reduce((ar, e) => {
        var url = e.getLinkUrl();
        if (url) ar.push({ url: url, text: e.getText(), row: i + 1, col: j + 1 });
        return ar;
      }, [])
    )
  );
console.log(res)
  • var test3 = sheet.getRange("A1:A10").getRichTextValues(); 返回 RichTextValue[][] 的对象。由此,在您的问题中获得了这样的结果。当您想要检索URL时,需要从该对象中检索它。

参考资料:

编辑:

the thing I try to obtain is this something like this : (which is the link to the cell A1) https://docs.google.com/spreadsheets/d/###/edit#gid=0&range=A1, 我理解你想要检索单元格的超链接。在这种情况下,getRichTextValue 无法使用。那么,以下是一个示例脚本,您可以看一下:

示例脚本:

function myFunction() {
  // Ref: https://dev59.com/q2Ei5IYBdhLWcg3wfsUj#21231012
  const columnToLetter = column => {
    let temp,
      letter = "";
    while (column > 0) {
      temp = (column - 1) % 26;
      letter = String.fromCharCode(temp + 65) + letter;
      column = (column - temp - 1) / 26;
    }
    return letter;
  };

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Liste");
  var range = sheet.getRange("A1:A10");
  
  var spreadsheetUrl = ss.getUrl();
  var sheetId = sheet.getSheetId();
  var startRow = range.getRow();
  var endRow = startRow + range.getNumRows() - 1;
  var startCol = range.getColumn();
  var endCol = startCol + range.getNumColumns() - 1;
  var cellLinks = [];
  for (var r = startRow; r <= endRow; r++) {
    for (var c = startCol; c <= endCol; c++) {
      var a1Notation = columnToLetter(c) + r;
      cellLinks.push({cell: a1Notation, url: `${spreadsheetUrl}#gid=${sheetId}&range=${a1Notation}`});
    }
  }
  console.log(cellLinks)
}
  • 在上面的脚本中,返回了单元格"A1:A10"的超链接。例如,当使用var range = sheet.getRange("A1");时,仅返回单元格"A1"的超链接。

我尝试了两种代码,它们都返回[]和[[],[],[],[]],但我真的不明白为什么。我们可以说这段代码应该返回单元格的URL吗?因为也许当我提问时没有表述清楚。 但是对我来说,这些代码都没有起作用。 - Madar
@Madar 谢谢您的回复。对于造成的不便我深表歉意。在我的答案中,数组的每个元素都是JSON对象。所以在这种情况下,它看起来像[{ur:"###",text:"###",row:##,col:##}, {,,,}, ]。从“我尝试了两种代码,它们返回[]和[[],[],[],[]]”这句话中,我担心您可能没有使用我的建议脚本。这个怎么样?为了确认您当前的情况,您能否提供一个样本电子表格以重现您的问题?通过这样做,我想确认一下。 - Tanaike
@Tainake,感谢您的帮助,但我不太明白JSON对象的故事。示例电子表格非常简单,只有一个名为“Liste”的工作表和以下单词从A1到A8开始:appli info motivation anime dev perso reflexion funny sad - Madar
@Madar 感谢您的回复并提供样本电子表格。不幸的是,我无法打开您的样本电子表格。对此我感到抱歉。您能再次确认一下吗? - Tanaike
1
@Madar 谢谢您的回复。我很高兴您的问题得到了解决。 - Tanaike
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接