Google apps script GoogleApps脚本从工作表中提取特定列,并使用filter&;地图--慢

Google apps script GoogleApps脚本从工作表中提取特定列,并使用filter&;地图--慢,google-apps-script,Google Apps Script,提前感谢你的帮助。我不熟悉应用程序脚本 我有一张98列25000行的gsheet。我所要做的就是把98列中的24列复制到一张新的工作表上 目前我正在使用过滤器和映射,它可以工作: var data=sourceSheet.getDataRange().getValues()//将所有列和行读入数组 var filterData=data.filter(函数(e,j){return j>0&&e}).map(函数(e){return[e[88]、e[14]、e[13]、e[4]、e[17]、e[8

提前感谢你的帮助。我不熟悉应用程序脚本

我有一张98列25000行的gsheet。我所要做的就是把98列中的24列复制到一张新的工作表上

目前我正在使用过滤器和映射,它可以工作:

var data=sourceSheet.getDataRange().getValues()//将所有列和行读入数组

var filterData=data.filter(函数(e,j){return j>0&&e}).map(函数(e){return[e[88]、e[14]、e[13]、e[4]、e[17]、e[87]、e[91]、e[48]、e[57]、e[31]、e[89]、e[82]、e[70]、e[97]、e[47]、e[30]、e[72]、e[71]、e[67]、e[34]、e[33]、e[00]、e[38]、e[39]})//仅将我想要的列提取到新数组中

但第二行几乎需要一个小时才能执行!我这样认为是因为它正在逐个处理每个元素,即使只是返回每个元素

我没有尝试过一次一列地获取值和设置值,因为我读到的所有内容都会限制外部调用,并在内存中执行所有操作。我无法想象一个一个地推送元素会比过滤更快


加快执行速度的建议?

另一种看待问题的方法可能更具时效性且更易于实施,如下所示:

  • 使用
    copyTo(电子表格)
    ()将原始工作表复制到新工作表中。您可能还想查看这篇文章,了解有关在同一电子表格中创建工作表的更多信息()

  • 删除您不想保留的列
    deleteColumn(columnPosition)
    deleteColumns(columnPosition,多少)
    (请参阅)。 您可能还希望开始删除工作表右侧的列,以使实现更容易

  • 如果有帮助,请告诉我

    function doCopy(SpreadID, OrgSheet, DestSheet, OrgRange, Sql, DestCell) { 
      var mySpread = SpreadsheetApp.openById(SpreadID);
      var myQry = '=QUERY(' + OrgSheet + "!" + OrgRange + ',\"'+ Sql + '\")';
      var myDestSheet = mySpread.getSheetByName(DestSheet);
      myDestSheet.getRange(DestCell).setFormula(myQry);
    }
    
    要调用的示例,但目标工作表必须为空:

    doCopy(spreadsheetId,"Sheet1", "Sheet2", "A:G", "Select A, C, F", "A1");
    

    请尝试使用QueryTanks David_cav。我忘了指出,我需要的24列的顺序与原来的98列表格不同。真的,对不起,DemoMan。一开始我没弄明白。我刚刚尝试了user11982798提出的解决方案,它在一小部分数据上运行良好。我认为它应该也适用于您的用例。祝你好运谢谢用户11982798——我很快就会试试这个!完美的解决方案!你让我看到了让公式在脚本中做更多的工作而做更少的工作的想法。非常非常感谢!并尝试在查询中使用order by、group by、where、calculation等,例如:“Select A,C,F where A='test'order by C,F”。我没有试过。