繁体   English   中英

Google 表格 - 在导入 la importRange 时维护超链接格式的脚本?

[英]Google Sheets - script that maintains hyperlink formatting on import a la importRange?

我目前使用下面的基本脚本导入大量单元格(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)

感谢您的任何帮助!

回答:

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

在同一个电子表格中:

正如您已经推断出的, getValues()只能是 Number、Boolean、Date 或 String 类型,并且公式对象不算作其中任何一种。 getDisplayValues()也有同样的问题,因为它不能采用基础公式。

查看CopyPasteType的文档,您可以看到使用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 Script 功能做很多事情。

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

提交 Google Sheets API 功能请求的页面在这里

我希望这对你有帮助!

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM