首页 > 解决方案 > 谷歌表格 - 在导入 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)

标签: javascriptgoogle-sheetshyperlinkgoogle-sheets-formulagoogle-sheets-api

解决方案


回答:

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

在同一个电子表格中:

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

查看CopyPasteTypes 的文档,您可以看到使用PASTE_NORMAL枚举 pastes 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 提交功能请求的页面在此处

参考:


推荐阅读