目前,我使用下面的基本脚本导入了大量单元格(2500行,200列)。这些列中大约有20个是超链接,我希望保留它们的格式,但在获取它们时会丢失它们。我确信这是因为getValues可能只具有数字、布尔值、日期或字符串类型。有人知道这里有什么解决办法吗?
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公式(另一方面,请注意'query‘函数遭受相同的格式丢失问题)。我对importRange的问题有两方面: 1)它半连续地获取数据,这损害了我的电子表格的性能;2)由于“加载.”由于调用的大小而产生的问题,我需要将请求分解为5个离散的请求,并将它们分组到一个arrayFormula中,以使其一致工作--这感觉很笨重。
另一个可能的解决方案是setShowHyperlink(showHyperlink)函数吗?不知道这是怎么回事,我也没见过有人用它,所以我怀疑它。这只是个想法。https://developers.google.com/apps-script/reference/spreadsheet/range#setShowHyperlink(Boolean)
发布于 2020-01-28 01:02:13
答案:
若要在同一个电子表格中从一个工作表复制到另一个工作表,可以使用Range.copyTo(destination, copyPasteType, transposed)
方法和PASTE_NORMAL
枚举数对公式和文本进行复制。对于一个电子表格到另一个电子表格,可以使用Sheet.copyTo()
方法。
在同一电子表格中:
正如您已经推断的,getValues()
只能是类型为数字、布尔值、日期或字符串的类型,而公式对象并不是这些类型中的任何一个。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()
方法太慢了,那么使用现有的sheet API和Apps脚本功能就无能为力了。
但是,您可以让Google知道这是一个对Sheets很重要的特性,并且您希望请求他们实现它。谷歌的问题跟踪器是开发人员报告问题和为他们的开发服务提出功能请求的地方。
为Google提交特性请求的页面是这里。
参考文献:
https://stackoverflow.com/questions/59905819
复制相似问题