【问题标题】:Programmatically build a hyperlink to a named range in Sheets以编程方式构建指向表格中命名范围的超链接
【发布时间】:2017-03-01 16:18:31
【问题描述】:

我有一个包含许多命名范围的电子表格,我想要一个目录,它提供超链接以跳转到它们。

在 UI 中,我可以创建一个指向命名范围的超链接,最终格式为:

https://docs.google.com/spreadsheets/d/xxxxx/edit#rangeid=yyyyy

其中 xxxx 是一个长电子表格 ID,yyyy 是一系列数字。

由于我有很多这样的链接,我想使用 Google Apps 脚本以编程方式生成所有这些链接。我可以使用Spreadsheet.getRangeByName 找到命名范围对象,但我找不到从中获取 rangeid 的方法。

【问题讨论】:

  • 查看NamedRange class documentation,您会在其中找到getId()
  • 遗憾的是,该文档适用于 Google Docs,而不是 Google Sheets。我今天下午打了几次!
  • 对不起,打错了。 Try this one. - 没有 id...
  • 我在 the external Google Sheets REST API 中找到了命名范围 - 并在 API explorer 中尝试了它,但遗憾的是,返回的 namedRangeIds 在这种情况下似乎不起作用。
  • 我运行了几个脚本来查看是否没有记录某些内容并且找不到任何内容。我显示的部分不使用命名范围,而是实际范围,因此获取范围的 R1 表示法并将链接生成为:docs.google.com/spreadsheets/d/xxxx/… 其中 zzzz = 工作表 ID。通过var key = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getSheetId();获取它

标签: google-apps-script google-sheets


【解决方案1】:

这似乎是不可能的,但作为一种解决方法,Karl_S 建议使用有效的范围链接:

function createNamedRangeUrl(name) {
  var root = SpreadsheetApp.getActiveSpreadsheet(); 
  var range = root.getRangeByName(name); 
  var sheetId = range.getSheet().getSheetId(); 
  var rangeCode = range.getA1Notation(); 
  return ("https://docs.google.com/spreadsheets/d/" + 
  root.getId() + "/edit#gid=" + sheetId + "&range=" + rangeCode); 
}

【讨论】:

    【解决方案2】:

    您可以使用高级 Google 服务获取命名范围的 ID:Google Sheets API。在资源 - 高级 Google 服务...

    中打开它

    然后使用spreadsheets.get 获取您的 Google 表格数据,包括命名范围信息:

    var spreadsheetId = '...';
    
    var ssData = Sheets.Spreadsheets.get(spreadsheetId);
    var namedRanges = ssData.namedRanges;
    
    Logger.log(namedRanges);
    

    结果:


    注意:API 返回的namedRangeId 被混淆(?),您不能直接使用它以编程方式创建链接。由于某种原因,它与 UI 中看到的不同:

    【讨论】:

    • 我认为这些是 REST API 返回的相同 ID。正如我们都注意到的那样,可悲的是,这些似乎在链接中不起作用。
    【解决方案3】:
    var fullSpreadsheetLink = "full spreadsheet link goes here"
    var spreadsheetTabName = "tab name goes here"
    
    var spreadsheet = SpreadsheetApp.openByUrl(fullSpreadsheetLink);
    var sheet = spreadsheet.getSheetByName(spreadsheetTabName);
    
    var myCell = sheet.getRange("A1");
    var linkCell = sheet.getRange("A2")
    
    var dataSourceUrl = myCell.getDataSourceUrl();
    var urlArray = dataSourceUrl.split("&");
    
    linkCell.setValue("=HYPERLINK(\"#"+urlArray[3]+"&"+urlArray[4]+"\",\"link to A1\")");
    

    【讨论】:

    • 没有评论的只有代码的答案是没有用的。解释你的代码、你的流程、你的解决方案,尤其是因为这是一个迟到的答案。
    • Range.getDataSourceUrl() 返回一个以 &range= 结尾的完整链接。它不是一个命名的范围 id。
    猜你喜欢
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2017-09-25
    • 2014-04-11
    相关资源
    最近更新 更多