Google Apps脚本从工作表中提取特定列,然后使用过滤器和地图将其放入新工作表中-缓慢

时间:2019-10-12 11:23:37

标签: google-apps-script

在此先感谢您的帮助。我是应用脚本的新手。

我有一个gsheet,包含98列和25000行。我要做的就是将98列中的24列复制到新工作表中。

当前我正在使用过滤器和地图,并且可以正常工作:

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

var filterData = data.filter(function(e,j){return j> 0 && e})。map(function(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]]}); //仅将我想要的列提取到新数组中

但是第二行要花将近一个小时才能执行!我猜想是因为它只是按返回方式处理每个元素,即使它只是返回每个元素。

我没有一次尝试getValue'ing和setValue'ing列,因为我读到的所有内容都会限制外部调用并在内存中进行所有操作。而且我无法想象将元素逐1推送会比过滤更快。

建议更快执行?

2 个答案:

答案 0 :(得分:2)

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");

答案 1 :(得分:0)

另一种解决问题的方法可能更省时,更容易实现:

  1. 使用copyTo(spreadsheet)https://developers.google.com/apps-script/reference/spreadsheet/sheet#copytospreadsheet)将原始工作表复制为新工作表。您可能还需要查看这篇文章,以获取有关在同一电子表格(Google Script to Duplicate Sheet that is Not Active)中创建工作表的更多信息

  2. 删除不想保留的列deleteColumn(columnPosition)deleteColumns(columnPosition, howMany)(请参阅https://developers.google.com/apps-script/reference/spreadsheet/sheet#deletecolumncolumnposition)。 您可能还希望开始从工作表的右侧删除列,以使实现更容易。

让我知道是否有帮助。