Google电子表格:动态超链接公式

时间:2015-01-08 02:31:18

标签: google-sheets

我试图创建一个动态的HYPERLINK公式,该公式将根据A列中的工作表名称自动创建链接,但我不确定如何(或者是否可能)根据名称获取工作表的URL。

以下是设置:

  • 包含多个标签的单个Google电子表格
  • 标签名称:1500,1501,1502,合并

在合并选项卡上,我有两列:列A是工作表名称,列B是HYPERLINK公式,单击时应打开相应的工作表。

有没有办法以编程方式根据A列中的工作表名称获取工作表的URL?也许我可以使用脚本用URL填充C列,然后使用以下公式:= HYPERLINK(C2,A2)?

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

很高兴看到这是谷歌的热门搜索,但没有答案。

无论如何,我发现这个方法对我有用:使用&将超链接与来自不同列的值结合起来,基本示例如下所示:

dynamiclly generate hyperlinks in Google Sheets

答案 1 :(得分:1)

如果您尝试根据名称自动生成特定工作表的直接URL,并且不想使用脚本,那么您就不走运了。目前,直接链接到特定工作表的唯一方法是将正确的gid编号附加到电子表格网址。必须从活动工作表的URL手动复制gid,或使用脚本创建的自定义函数自动提取gid。

答案 2 :(得分:1)

由于您愿意使用脚本,因此看来我找到了有关如何执行脚本的详细教程。 https://www.benlcollins.com/spreadsheets/index-sheet/

function onOpen() {

  var ui = SpreadsheetApp.getUi();

  ui.createMenu('Index Menu')
      .addItem('Create Index', 'createIndex')
      .addItem('Update Index', 'updateIndex')
      .addToUi();
}


// function to create the index
function createIndex() {

  // Get all the different sheet IDs
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();

  var namesArray = sheetNamesIds(sheets);

  var indexSheetNames = namesArray[0];
  var indexSheetIds = namesArray[1];

  // check if sheet called sheet called already exists
  // if no index sheet exists, create one
  if (ss.getSheetByName('index') == null) {

    var indexSheet = ss.insertSheet('Index',0);

  }
  // if sheet called index does exist, prompt user for a different name or option to 
cancel
  else {

    var indexNewName = Browser.inputBox('The name Index is already being used, 
please choose a different name:', 'Please choose another name', 
Browser.Buttons.OK_CANCEL);

    if (indexNewName != 'cancel') {
      var indexSheet = ss.insertSheet(indexNewName,0);
    }
    else {
      Browser.msgBox('No index sheet created');
    }

  }

  // add sheet title, sheet names and hyperlink formulas
  if (indexSheet) {

    printIndex(indexSheet,indexSheetNames,indexSheetIds);

  }

}



// function to update the index, assumes index is the first sheet in the workbook
function updateIndex() {

  // Get all the different sheet IDs
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var indexSheet = sheets[0];

  var namesArray = sheetNamesIds(sheets);

  var indexSheetNames = namesArray[0];
  var indexSheetIds = namesArray[1];

  printIndex(indexSheet,indexSheetNames,indexSheetIds);
}


// function to print out the index
function printIndex(sheet,names,formulas) {

  sheet.clearContents();

  sheet.getRange(1,1).setValue('Workbook Index').setFontWeight('bold');
  sheet.getRange(3,1,names.length,1).setValues(names);
  sheet.getRange(3,2,formulas.length,1).setFormulas(formulas);

}


// function to create array of sheet names and sheet ids
function sheetNamesIds(sheets) {

  var indexSheetNames = [];
  var indexSheetIds = [];

  // create array of sheet names and sheet gids
  sheets.forEach(function(sheet){
    indexSheetNames.push([sheet.getSheetName()]);
    indexSheetIds.push(['=hyperlink("#gid=' 
                        + sheet.getSheetId() 
                        + '","' 
                        + sheet.getSheetName() 
                        + '")']);
  });

  return [indexSheetNames, indexSheetIds];

}