谷歌电子表格的脚本,为一个单元格提供多个超链接选择

时间:2012-05-22 23:11:20

标签: google-apps-script google-sheets google-docs

我有一个谷歌电子表格。在某些单元格中,它有多个名称(字符串),我想与各个超链接关联。

E.g。如果我有一个像“查尔斯达尔文”这样的单元格,我很容易通过这样的方式创建一个超链接 =Hyperlink(VLOOKUP("Charles Darwin", People!$A$1:$B$738, 2, false), "Charles Darwin") (请注意,我有一张“人物”表,我从中获取超链接)

但如果我碰巧在该单元格中有多个条目,请说“;”或换行分隔,例如“查尔斯达尔文;乔治华盛顿”,我不能这样做。我想让用户能够点击单元格,将单元格的内容发送(作为参数)到某种脚本,并为该脚本找到我的“人物”表中的超链接字符串,然后向用户显示该单元格旁边的一个“弹出窗口”,可以单击所需的超链接。

我试图在这个论坛上找到类似的东西,但似乎没有类似的东西出现。有人可能有一个或两个链接(或基本的示例代码),我可以开始试图解决这个问题? (我假设这是可能的)。

由于

1 个答案:

答案 0 :(得分:3)

在同一个单元格上不可能有两个超链接。

可以将脚本编写到Google Spreadsheets,但我不确定它是否适合您的用例。我看到的解决方案是这样的:

  • 用户点击所需的单元格,选择它。
  • 然后他点击自定义菜单并在那里选择一个条目,例如显示链接
  • 弹出窗口将显示(不包括单元格,但以屏幕为中心)并带有链接。
你觉得这样好吗?代码看起来像这样(打开菜单Tools> Script Editor)

function onOpen() {
  SpreadsheetApp.getActive().
    addMenu("Test", [{name: 'Show Links', functionName:'showLinks'}]);
}

function showLinks() {
  var values = SpreadsheetApp.getActiveRange().getValue().split(';');

  var app = UiApp.createApplication().setTitle('Links'); 
  var grid = app.createGrid(values.length, 2);

  for( var i = 0; i < values.length; ++i ) {
    var url = findLink(values[i]);
    grid.setWidget(
      i, 0, app.createLabel(values[i])).setWidget(
      i, 1, url ? app.createAnchor(url, url) : app.createLabel('Not Found'));
  }

  app.add(grid);
  SpreadsheetApp.getActive().show(app);
}

var mapName2Url = null;
function findLink(name) {
  if( mapName2Url == null ) { //lazy load
    mapName2Url = {};
    var data = SpreadsheetApp.getActive().getSheetByName('People').getDataRange().getValues();
    for( var i = 1; i < data.length; ++i ) //skipping the header
      mapName2Url[data[i][0]] = data[i][1];
  }
  return mapName2Url[name];
}

将其粘贴到脚本编辑器上后,运行onOpen函数两次以对其进行授权并为您创建菜单。下次打开电子表格时,应自动创建菜单。

顺便说一下,我还没有测试过这段代码,所以它可能包含愚蠢的错误。