【问题标题】:Import data from many different spreadsheets (slow)从许多不同的电子表格中导入数据(慢)
【发布时间】:2020-02-04 23:55:06
【问题描述】:

我有一个包含数十个导入范围的公式,来自许多不同的电子表格。当然,它会减慢电子表格的速度,每次在其中一个电子表格中进行修改时都会更新我的主电子表格...

我希望我的 IMPORTRANGE 公式每 24 小时刷新一次,而不是每次修改时刷新一次。似乎 importrange 不允许这样做,所以我正在寻找类似的东西(我想是一个脚本)。我发现了这个:Force IMPORTRANGE to update at certain intervals (我知道我必须对其进行一些修改,因为这个脚本将数据导出到另一个电子表格,我想从另一个电子表格导入,但这应该是可行的)   

我没有测试过这个脚本,但在尝试之前我有几个问题:

  1. 有没有更简单的解决方案,也许是不需要脚本的公式?或者一个我不知道的功能...

  2. 如果需要脚本,这种脚本(在上面的链接中)真的是有效的方法吗?我必须修改这个脚本才能从几十个不同的电子表格中导入。我想知道导入过程会有多慢,因为脚本每晚会有几十、几百个导入(可能有 5000 个单元格)每次进口)?如果它只是几分钟,没问题,但如果它意味着几个小时,那么就没有那么多了。


背景: 我经营一家活动机构。对于每个潜在客户,我们复制一个“客户”模板电子表格。 当潜在客户确认并成为客户时,我们将“客户”电子表格的 url 粘贴到主电子表格中(一行 = 一个客户 = 一个 url = 我的主公式中的一个 importrange)

借助一些 importrange 公式和查询,我们可以将所有事件的必要信息集中在主文件中的该文件上(请参阅“附加信息”)

它运行良好,但当然,当客户数量变多时,主电子表格会变慢,而且随着时间的推移只会变得更糟。

这是我目前在主电子表格中使用的公式: =QUERY({IMPORTRANGE(Clients!$K3;"Data!B16:M");IMPORTRANGE(Clients!$K4;"Data!B16:M");IMPORTRANGE(Clients!$K5;"Data!B16:M"); etc etc etc};"Select * where Col1<>''";0)

在哪里 Clients!$K 是我们粘贴“客户”电子表格 URL 的列。当然,我们还有更多 IMPORTRANGE 公式(每个客户行一个)

非常感谢您对此问题的任何帮助!

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    IMPORTRANGE 公式通过连接到另一个工作表从另一个工作表中检索数据,这比其他工作表慢。因此,如果您想避免长时间等待,通常最好尽量减少这些外部调用的数量。

    由于您的电子表格包含大量数据,因此最好的替代方法是使用脚本。

    解决方法

    您可以尝试使用此脚本并使用触发器将其触发到您提到的时间执行,而不是使用每 30 分钟重新计算数据的IMPORTRANGE

    function importRange() {
      var ss = SpreadsheetApp.openById("15P9QT4ukwQYnsF7RiHH-e1sSHlK7oyKqhbteiw0_sxQ");
      var sourceSheet = ss.getSheetByName("Data");
      var urlsSheet = ss.getSheetByName("URLs");
      var urls = urlsSheet.getRange("B2:B").getValues();
      var j=1;
      for (var i=0;i<urls.length;i++) { 
        if (urls[i][0] != "") {
          var valuesToImport = SpreadsheetApp.openByUrl(urls[i][0]).getSheetByName("ClientData").getRange(1,1,3,2).getValues();
          sourceSheet.getRange(j,1,3,2).setValues(valuesToImport);
          j=j+3;
        }
       }
    }
    
    

    该脚本通过收集所有 url、检查 url 是否不是空单元格来工作,如果是,它会获取所需的数据并将其粘贴到 Data 表上。由于需要粘贴到工作表中的数据有3行,为了能够通过选择适当的范围来执行此操作而不覆盖单元格,因此使用了j变量。

    如果您使用以下属性在上述函数上添加触发器,您的脚本将在您方便的时间范围内每天执行。

    要添加触发器,您必须在您的 Apps 脚本项目中单击此图标,然后使用上述设置对其进行配置。

    创建触发器

    触发器设置

    避免长时间等待的一些提示:

    • 使用封闭范围引用 - 例如,您可以使用B16:M500,而不是使用B16:M(假设您想要的数据以M500结尾)。

    • 使用 Apps 脚本;

    • 迁移到数据库 - 如果您的电子表格变得太慢而无法满足您的喜好,您可以随时尝试替代方案 - 例如使用数据库来存储您的数据并执行所有必要的操作。

    此外,我建议您检查这些链接,因为它们可能会有所帮助:

    【讨论】:

    • 太棒了,我现在就试试这个脚本!另外,你的意思是:“你总是可以尝试替代方案——比如使用数据库来存储你的数据并执行所有必要的操作。”在这种情况下,什么是数据库?谢谢!
    • 再次嗨,所以我测试了脚本。似乎有一个问题:在最后一行中,我将 THE_RANGE_WHERE_YOU_IMPORT_THE_VALUES 替换为“A1:Z”。我收到一个错误,说数据源中的行数与范围内的行数不对应。因此,作为测试,我将 A1:Z 替换为 A1:A10(我的测试数据中有 10 行)——它可以工作,但它只从最后一个 URL 导入数据。这并没有让我太惊讶;我实际上想知道脚本如何将数据粘贴到 sourceSheet 中。你知道如何解决这个问题吗?再次感谢您
    • @Kev,如果没有看到您用于从中导入数据的工作表,很难诊断您的问题,因为对我来说它按预期工作。您可能需要根据自己的喜好调整范围以按预期工作(我只使用了您提供的那些),但它应该通过您拥有的所有链接。该脚本使用setValues() 函数粘贴数据。
    • 嗨 Ale13,非常感谢您的回复。我用虚拟电子表格创建了一个驱动器文件夹:drive.google.com/drive/folders/… 该脚本链接到“主电子表格”。我不是程序员,除非我在替换值时出错,否则脚本中似乎缺少一些东西。基本上是说“将每个导入粘贴在另一个之下” - 目前看来,脚本将导入粘贴在另一个之上,因此只有最后一个导入(来自最后一个 URL)保留在执行结束时.
    • 你好@Kev!感谢您提供的电子表格!我更新了我的答案,我希望现在一切都按预期工作。干杯! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    相关资源
    最近更新 更多