【问题标题】:Google Sheets - script that maintains hyperlink formatting on import a la importRange?谷歌表格 - 在导入 la importRange 时保持超链接格式的脚本?
【发布时间】:2020-01-25 02:17:00
【问题描述】:

我目前使用下面的基本脚本导入大量单元格(2500 行,200 列)。其中大约 20 个列是超链接,我想保留其格式,但目前在获取它们时会丢失。我确定这是因为 getValues 可能只有 Number、Boolean、Date 或 String 类型。有人知道这里的解决方法吗?

function  importOnOpen() {
var values = SpreadsheetApp.openById('ABCDEFGHIJKLMNOPQRSTUVWXYZ').
  getSheetByName('exportSheet').getRange('A1:HZ2500').getValues();
  SpreadsheetApp.getActive().getSheetByName('importSheet').
  getRange(1,1,values.length,values[0].length).setValues(values);}

一种选择是为特定的超链接列利用 getFormulas,但如果可能的话,我想避免将公式完全拉入目标工作表,以使其保持简洁。同样为每个超链接列单独调用似乎很笨拙,尽管我想我可以将它们组合在一起。

我之前的解决方案是根本不使用脚本,而是使用效果很好的 importRange 公式(另一方面请注意,“查询”函数会遇到同样的格式丢失问题)。我的 importRange 问题有两个方面:1)它半连续地获取数据,这会损害我的电子表格的性能,以及 2)由于我需要将请求分解为调用大小导致的“正在加载...”问题5 个离散的请求并将它们分组到一个 arrayFormula 中以使其始终如一地工作 - 这感觉很笨重。

另一种可能的解决方案是 setShowHyperlink(showHyperlink) 函数吗?不知道这是如何工作的,而且我还没有看到有人使用它,所以我对此表示怀疑。只是一个想法。 https://developers.google.com/apps-script/reference/spreadsheet/range#setShowHyperlink(Boolean)

【问题讨论】:

  • 这些是什么类型的超链接以及丢失了什么格式?我重新创建了一个这种大小的工作表来尝试复制您的问题,但是使用您的代码传递的超链接没有问题。
  • 好问题。以下是一些未正确调用的示例公式(即,仅调用了文本,但没有可以单击的相应链接) a) 超链接 (BM2,ES2) - 其中 BM2 是 URL,ES2 是我附加到基本 URL 的文本...只有 ES2 中的文本被拉入 b) 超链接 ("exampleWebsite.com/",DK2) ...只有 DK2 中的文本被调用
  • 有趣的是,我确实有一些列保留了超链接格式——这些单元格中有实际的 URL。但与此同时,我也有其他包含实际 URL 的单元格,它们的超链接格式没有被保留。示例:imgur.com/a/HaxaswA 但同样,没有包含“hyperlink(x,y)”的单元格保留任何超链接格式。

标签: javascript google-sheets hyperlink google-sheets-formula google-sheets-api


【解决方案1】:

答案:

要在同一个电子表格中从一个工作表复制到另一个工作表,您可以使用 Range.copyTo(destination, copyPasteType, transposed) 方法和 PASTE_NORMAL 枚举器来复制公式和文本。对于一个电子表格到另一个电子表格,可以使用Sheet.copyTo() 方法。

在同一个电子表格中:

正如您已经推断的那样,getValues() 只能是 Number、Boolean、Date 或 String 类型,而公式对象不计入其中任何一种。 getDisplayValues() 也有同样的问题,它不能采用底层公式。

查看CopyPasteTypes 的文档,您可以看到使用PASTE_NORMAL 枚举粘贴values, formulas, formats and merges

使用此功能,只需几次调用即可一次性复制整个工作表:

function copyAllTheThings() {
  var ss = SpreadsheetApp.openById('<sheet-id>');
    
  var range = ss.getSheetByName('exportSheet')
                .getRange('A1:HZ2500');

  var importTo = ss.getSheetByName('importSheet')
                   .getRange(range.getA1Notation());

  range.copyTo(importTo, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}

从一个电子表格复制到另一个:

如果您想将工作表从一个电子表格导入到另一个电子表格,您可以使用Sheet.copyTo() 方法。这将复制整个工作表而不仅仅是一个范围,但可以使用它来保留要复制的工作表中的数据格式和公式:

function  importOnOpen() {
  var otherSS = SpreadsheetApp.openById('<spreadsheet-id-to-copy-to>');
  
  var export = SpreadsheetApp.openById('<spreadsheet-id-to-copy-from>')
                             .getSheetByName('exportSheet');
    
  export.copyTo(otherSS);
}

功能要求:

很遗憾,如果 copyTo() 方法由于您的工作表大小而太慢,那么您无法使用现有的 Sheets API 和 Apps 脚本功能做很多事情。

但是,您可以让 Google 知道这是一项对 Sheets API 很重要的功能,并且您希望请求他们实施该功能。 Google 的 Issue Tracker 是开发人员报告问题并为其开发服务提出功能请求的地方。

为 Google Sheets API 提交功能请求的页面是 here

参考资料:

【讨论】:

  • 首先,非常感谢您对此的指导!我真的很感激它,因为我已经挂断了一段时间。我现在遇到一个错误:TypeError:无法调用 null 的方法“getRange”。 (第 30 行,文件“代码”)我想是因为我正在尝试将超链接导出到新的(活动的)电子表格。尝试自己更新代码但没有运气。我很想知道到底复制了什么:超链接公式,或者超链接本身就是一个 importRange。我一直在尝试减少目标工作表中的公式以提高性能。
  • 第 30 行是哪一行?错误在哪里抛出?
  • 我的错。这一行: var importTo = ss.getSheetByName('importSheet') -------- 这是因为我输入的工作表名称在“ss”源电子表格中不存在。我正在尝试将源电子表格中的数据提取到未明确定义的不同目标电子表格中。
  • 我尝试使用下面的代码修复它,但没有成功,因为“range.copyTo”行出现错误,指出“目标范围和源范围必须在同一个电子表格中。(第 33 行, 文件 "代码")" function copyAllTheThings() { var ss = SpreadsheetApp.openById('&lt;sheet-id&gt;'); var range = ss.getSheetByName('exportSheet') .getRange('A1:HZ2500'); var importTo = SpreadsheetApp.getActive().getSheetByName('importSheet') .getRange(range.getA1Notation()); range.copyTo(importTo, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false); }
  • 谢谢拉法。因为我的源电子表格中有很多公式(除了超链接我还有很多),不幸的是,copyTo 函数没有实现我的目标,因为它会大大降低目标电子表格的性能。我一直在寻找一个与 importRange 函数完全一样的脚本,而且它越来越看起来不存在。 importRange 使用单个公式调用所有值,重要的是仍然保留超链接的格式。对我来说这似乎很奇怪,但这不是我第一次遇到这种情况。
猜你喜欢
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多