【问题标题】:Optimizing Script Pulling Data From Multiple Google Sheets优化从多个 Google 表格中提取数据的脚本
【发布时间】:2020-02-19 16:37:09
【问题描述】:

我想要一个脚本来搜索多个 Google 表格文件并从每个文件中提取特定信息以创建我的老板可以轻松查看的主状态页面。以下代码有效,它真的很慢(而且我可能不是最简单的方法)。加快速度的最佳方法是什么?我确定有一些方法可以设置数组,但我找不到它。

  var ss = SpreadsheetApp.getActive()
  var folder = DriveApp.getFolderById()

// Sets up the rules for what to search
  var files = folder.getFilesByType(MimeType.GOOGLE_SHEETS)
  while (files.hasNext()) {
    var file = files.next()
    var filelog = file.getId()
    var tickets = SpreadsheetApp.openById(file.getId())

//Gets Values from Each File
    var ticketno = tickets.getRange('Form!C1').getValue()
    var jobname = tickets.getRange('Form!C3').getValue()
    var status = tickets.getRange('Form!H1').getValue()
    var assigned = tickets.getRange('Form!C22').getValue()
    var description = tickets.getRange('Form!A18').getValue()


//Sets Values to Master Spreadsheet
    var ssh = ss.getSheetByName("Order Status")
    ssh.insertRowAfter(1)
    ss.getRange('Order Status!A2').setValue(ticketno)
    ss.getRange('Order Status!B2').setValue(jobname)
    ss.getRange('Order Status!C2').setValue(status)
    ss.getRange('Order Status!D2').setValue(assigned)
    ss.getRange('Order Status!E2').setValue(description)

【问题讨论】:

    标签: optimization google-apps-script google-sheets iteration


    【解决方案1】:

    这更快,但实际上最大的时间片段可能只是打开文件。

    function faster() {
      var ss=SpreadsheetApp.getActive();
      var folder=DriveApp.getFolderById();
      var files=folder.getFilesByType(MimeType.GOOGLE_SHEETS);
      while (files.hasNext()) {
        var file=files.next();
        var tss=SpreadsheetApp.openById(file.getId());
        var vA=tss.getSheetByName('Form').getRange(1,1,22,8).getValues();
        var ssh=ss.getSheetByName("Order Status")
        ssh.insertRowAfter(1);//you could avoid this by creating a sheet that you could append to and that would be a little faster
        SpreadsheetApp.flush();//not sure if this is needed but this has to complete before the next operation takes place
        ssh.getRange(2,1,1,5).setValues([[vA[0][2],vA[2][2],vA[0][7],vA[21][2],vA[17][0]]]);
      }
    }
    

    【讨论】:

    • 我运行了我正在测试的 6 个文件夹中的文件数,最多 48 个(大约是我期望的最大值)。在 6 条记录中,你的记录是 9.75 秒,我的记录是 22 秒。在 48 Records,你的时间是 2:05.34 到 3:43.44。两倍的速度是一个相当不错的改进。我认为你是对的,挂断是在打开每个文件。
    • 您可以尝试删除 SpreadsheetApp.flush()。如果它仍然运行良好,您可能会更快一点。我认为使用 Google Apps 脚本没有更快的方法。但可能@Tanieke 或其他一名志愿者稍后会来,他们可能知道如何使用 Sheets API 更快地运行它。我不像其他人那样熟悉高级 API。访问 I/O 总是一个瓶颈。
    • 您可以尝试使用 Firebase 并将所有数据存储在数据库中,然后让主工作表从一个来源获取所有数据。这样会快很多。
    【解决方案2】:

    我循环了脚本 50 次。你的脚本的运行时间是 259,342 秒,“我的”运行时间是 83,479 秒

    function notAsSlow(){
    
    var ss = SpreadsheetApp.getActive()
      var folder = DriveApp.getFolderById("1fgROgjHBssvhaSIy5KWv0BhNFlH3EfTI")
    
      var files = folder.getFilesByType(MimeType.GOOGLE_SHEETS)
    
      var array=[];
    
        while (files.hasNext()) {
    
          var file = files.next()
          var filelog = file.getId()
          var tickets = SpreadsheetApp.openById(file.getId())
    
          var dataTickets = tickets.getSheetByName("Form").getDataRange().getValues();
    
          var ticketno = dataTickets[0][2];
          var jobname = dataTickets[2][2];
          var status = dataTickets[7][0];
          var assigned = dataTickets[21][2];
          var description = dataTickets[17][0];
    
          array.push([ticketno,jobname,status,assigned,description]);
    
        }
    
        var ssh = ss.getSheetByName("Order Status");
    
        if(array[0]){
          ssh.getRange(ssh.getLastRow()+1,1,array.length,5).setValues(array);
    
        }
    
    }
    

    【讨论】:

    • 我试图在多个文件上运行它,但我无法显示任何数据。我复制了你的代码,但也许有什么遗漏的地方?
    • @StephenSchonewolf 抱歉,我做错了。几分钟后,我将返回编辑后的脚本。
    • 我今天早上对它进行了负载测试。对于非常短的列表,即使我在代码中添加了格式和排序,它也运行不到 20 秒。当我尝试输入 80 个条目时,它仍然不到一分半钟。这正是我想要的!
    猜你喜欢
    • 2020-08-20
    • 1970-01-01
    • 2021-11-17
    • 2022-10-25
    • 2022-10-13
    • 2013-12-06
    • 2014-11-29
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多