如何通过大量导入范围加快Sheet加载时间?

时间:2017-02-15 16:59:32

标签: google-apps-script google-sheets

我被提升为开发和发展在工作中维护Google表格数据库。我对Google表格脚本编写很少了解从四处询问,研究它看起来像GAS可能是我需要开始下降的途径。

因此,Google表格中有3个工作簿; 2包含大量数据,另一个工作簿为我们的销售dpt提供UI。访问数据。我真的希望我可以和你分享这些,因为描述它们很困难。在UI工作簿中,单独的页面与一个数据库中的工作表配对(我们称之为数据库A)。

销售人员将转到用于销售设备的产品的UI表;工作表的顶部允许他基本上从数据库A中选择一行。选择完成后,工作表的其余部分将填充我们制造的产品,这些产品可以在顶部进行选择。我们制作的产品存储在另一个数据库(“B”)中。我们必须有两个数据库,因为我们之前已经在两个数据库组合的工作表中达到了单元格限制。

平均每个UI页面大约有150个Importranges。查看完成查询。

我们的问题是这个用户界面变得非常缓慢,初始加载时间使得路上的销售人员毫无价值,并且对办公室里的销售人员感到烦恼。进行初始选择(查询数据库A)时的延迟是可用的,但仍然比我们想要的慢得多。我们还没有完成构建UI页面。

我在网上看到,大多数人都建议使用Apps Script替换importrange,但对Apps Script一无所知,我无法理解正在做什么,或者主要是如何获取应用脚本并实际放入细胞中的数据。

所以我很感激能帮助你加快速度。

2 个答案:

答案 0 :(得分:0)

首先让我说Google Apps脚本文档多年来已经有了很大的改进,我发现它现在很容易使用。如果您在Google表格中打开代码编辑器并转到帮助菜单并选择API参考,那么这会将您链接到您需要了解的所有内容。如果您转到Google Apps reference for spreadsheets并查看SpreadsheetApp对象,您将看到有三个命令可以打开另一个电子表格而不是表单而是电子表格。您可以通过文件,ID或URL来完成。

如果您点击Url命令,它会带您进行如下示例:

// The code below opens a spreadsheet using its id and logs the name for it.
 // Note that the spreadsheet is NOT physically opened on the client side.
 // It is opened on the server only (for modification by the script).
 var ss = SpreadsheetApp.openByUrl(
     'https://docs.google.com/spreadsheets/d/abc1234567/edit');
 Logger.log(ss.getName());

正如它指出的那样,它实际上并没有打开客户端上的文件,只是在服务器上打开它。因此,您可能需要先手动打开它们才能了解它们的外观。一旦你知道它们的组织方式,你就可以使用open命令获取一个电子表格对象,然后从中选择一个特定的工作表,然后选择一个数据范围。一旦你有一个范围,那么你可以加载这样的数组。

var myArray = rng.getValues();

这会将整个范围一次性加载到一个javascript数组中,当然如果你可以从数组中过滤掉不需要的数据然后将它放到你想要的范围内的当前工作表中会很好。请注意,范围大小必须完全匹配,并且请注意范围从1开始,数组从0开始,这样可能会让您感到悲伤。另外,请允许我添加一些我遇到过的警告。

如果您处理一行或一列范围数组,那么您必须以正确的形式获取数组。我尝试在这里写它们但StackOverFlow文本转换器一直搞乱它们所以我建议你去讨论这个问题here

如果您过去使用过javascript编码,那么我猜测您可以使用新文档快速使用Google Apps脚本,并偶尔访问StackOverFlow以获得一两个问题。我从其他用户那里得到了一些很好的答案。如果您需要javascript参考here's one that I use

我希望这会有所帮助。

答案 1 :(得分:0)

您可能最好使用从Google Apps脚本提供的WebApp for UI,如果您有一些示例数据,我很乐意为您提供帮助。如果您仍想使用工作表,则可以使用每10分钟左右运行一次的Google Apps脚本功能替换importRanges,以保持更新UI工作表。它应该加快加载时间。这样的事情对你有用:

function importSheetA() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var database = SpreadsheetApp.openByUrl("DATABASE_A_URL");
var dataToCopy = database.getSheetByName("DATABASE_A_SHEET_NAME").getDataRange().getValues();
var copyToSheet = ss.getSheetByName("UI_SHEET_NAME");
var copyData = copyToSheet.clearContents().getRange(1, 1, dataToCopy.length, dataToCopy[0].length).setValues(dataToCopy);
}