Apps脚本:如何从没有公式的单元格获取超链接

Apps Script: how to get hyperlink from a cell where there is no formula

我有一个 sheet 超链接是在单元格中设置的,但 不是通过公式 。单击单元格时,在 "fx" 栏中它仅显示值。

我在网上搜索,但到处都是,信息是使用getFormula()提取超链接。

但在我的例子中根本没有公式集。

我可以看到图片中的超链接,但 "formula/fx" 栏中没有。

如何使用 Apps 脚本或任何公式获取该单元格的超链接?

当Excel包含超链接单元格的文件转换为Google电子表格时,也可以看到这种情况。就我而言,我使用 Sheets API 检索 URL。示例脚本如下。我认为可能有几种解决方案。所以请将此视为其中之一。

当您使用此脚本时,请在高级 Google 服务和 API 控制台中启用表格 API。您可以在 .

查看如何启用表格 API

示例脚本:

var spreadsheetId = "### spreadsheetId ###";
var res = Sheets.Spreadsheets.get(spreadsheetId, {ranges: "Sheet1!A1:A10", fields: "sheets/data/rowData/values/hyperlink"});
var sheets = res.sheets;
for (var i = 0; i < sheets.length; i++) {
  var data = sheets[i].data;
  for (var j = 0; j < data.length; j++) {
    var rowData = data[j].rowData;
    for (var k = 0; k < rowData.length; k++) {
      var values = rowData[k].values;
      for (var l = 0; l < values.length; l++) {
        Logger.log(values[l].hyperlink) // You can see the URL here.
      }
    }
  }
}

注:

  • 请设置spreadsheetId.
  • Sheet1!A1:A10 是一个示例。请根据您的情况设置范围。
  • 在这种情况下,rowData的每个元素对应于行的索引。 values的每个元素对应列的索引

参考文献:

如果这不是您想要的,请告诉我。我想修改一下。

当一个单元格只有一个 URL 时,您可以使用以下简单脚本从单元格中检索 URL。

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var url = sheet.getRange("A2").getRichTextValue().getLinkUrl(); //removed empty parentheses after getRange in line 2

来源:https://gist.github.com/tanaikech/d39b4b5ccc5a1d50f5b8b75febd807a6

我尝试了解决方案 2:

var urls = sheet.getRange('A1:A10').getRichTextValues().map( r => r[0].getLinkUrl() ) ;

我得到了一些链接,但大多数链接都为空。 我制作了解决方案 1 的较短版本,它产生了所有链接。

  const id = SpreadsheetApp.getActive().getId() ;
  let res = Sheets.Spreadsheets.get(id,
     {ranges: "Sheet1!A1:A10", fields: "sheets/data/rowData/values/hyperlink"});
  var urls = res.sheets[0].data[0].rowData.map(r => r.values[0].hyperlink) ;

大家好,

我希望这可以帮助您节省一些开发时间,因为它很难确定...

此自定义函数将采用 Google 表格单元格中的所有超链接,并且 return 它们作为基于第二个参数格式化的文本 [JSON|HTML|NAMES_ONLY|URLS_ONLY].

参数:

cellRef :您必须为单元格提供 A1 样式的单元格引用。 提示:要在没有 hard-coding 的单元格中执行此操作 字符串引用,可以使用 CELL 函数。 例如:“=linksToTEXT(CELL(“地址”,C3))”

style :定义输出字符串的格式。 有效参数是:[JSON|HTML|NAMES_ONLY|URLS_ONLY].

示例脚本

/** 
 * Custom Google Sheet Function to convert rich-text 
 * links into Readable links.
 * Author: Isaac Dart ; 2022-01-25
 * 
 * Params
 *  cellRef : You must provide an A1 style cell reference to a cell. 
 *            Hint: To do this within a cell without hard-coding
 *            a string reference, you can use the CELL function. 
 *            eg: "=linksToTEXT(CELL("address",C3))"
 * 
 *  style   : Defines the formatting of the output string.
 *            Valid arguments are : [JSON|HTML|NAMES_ONLY|URLS_ONLY].
 * 
 */

function convertCellLinks(cellRef = "H2", style = "JSON") {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var cell = sheet.getRange(cellRef).getCell(1,1);
  var runs = cell.getRichTextValue().getRuns();
  var ret = "";
  var lf =  String.fromCharCode(10); 
  runs.map(r => {
      var _url = r.getLinkUrl();
      var _text = r.getText();
      if (_url !== null && _text !== null) {
        _url = _url.trim(); _text = _text.trim();
        if (_url.length > 0 && _text.length > 0) {
          switch(style.toUpperCase()) {
            case "HTML": ret += '<a href="' + _url + '">' + _text + '}</a>' + lf; break;
            case "TEXT": ret += _text + ' : "' + _url + '"' + lf; break;
            case "NAMES_ONLY" : ret += _text + lf; break;
            case "URLS_ONLY" : ret += _url + lf; break;
            //JSON default : ...
            default: ret +=  (ret.length>0?(','+ lf): '') +'{name : "' + _text + '", url : "' + _url + '"}' ; break; 
          }
          ret += lf;
        }
      }
  });
  if (style.toUpperCase() == "JSON") ret = '[' + ret + ']';
  //Logger.log(ret);
  return ret;
}

干杯,

以撒