Google Apps Script извлекает определенные столбцы из листа и помещает их в новый лист, используя фильтр и карту - медленно - PullRequest
1 голос
/ 12 октября 2019

Заранее спасибо за помощь. Я новичок в скрипте приложений.

У меня есть таблица с 98 столбцами и 25000 строк. Все, что я хочу сделать, это скопировать 24 из 98 столбцов на новый лист.

В настоящее время я использую фильтр и карту, и это работает:

var data = sourceSheet.getDataRange (). GetValues ​​();// читать все столбцы и строки в массив

var filterData = data.filter (function (e, j) {return j> 0 && e}). map (function (e) {return [e [88]], е [14], е [13], е [4], е [17], е [87], е [91], е [48], е [57], е [31], е [89], е [82], е [70], е [97], е [47], е [30], е [72], е [71], е [67], е [34], е [33], е [00], е [38], е [39]]});// извлекаем только нужные столбцы в новый массив

, но для выполнения этой 2-й строки требуется почти час! Я предполагаю, что он обрабатывает каждый элемент 1 к 1, хотя он просто возвращает каждый из них.

Я не пробовал столбцы getValue'ing и setValue'ing по одному, потому что все, что ячитай говорит ограничивай внешние звонки и делай все в памяти. И я не могу представить, что нажатие элементов 1 на 1 будет быстрее, чем фильтрация.

Предложения по более быстрому выполнению?

Ответы [ 2 ]

2 голосов
/ 12 октября 2019
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");
0 голосов
/ 12 октября 2019

Другой способ взглянуть на проблему, которая может быть более эффективной с точки зрения затрат времени и простой в реализации, заключается в следующем:

  1. Дублируйте исходный лист на новый с помощью copyTo(spreadsheet) (https://developers.google.com/apps-script/reference/spreadsheet/sheet#copytospreadsheet). Вы также можете проверить этот пост для получения дополнительной информации о создании листа в той же электронной таблице ( Google Script to Duplicate Sheet, который не активен )

  2. Удалите столбцы, которые вы не хотите хранить, с помощью deleteColumn(columnPosition) или deleteColumns(columnPosition, howMany) (см. https://developers.google.com/apps-script/reference/spreadsheet/sheet#deletecolumncolumnposition).. Вы можете также начать удаление столбцов с правой стороны листа, чтобы упростить реализацию.

Дайте мне знать, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...