Импорт листов из папки в мастер, оптимизация кода, чтобы избежать ошибок во время выполнения строка за строкой - PullRequest
0 голосов
/ 07 февраля 2020

Здесь есть код, который загружает данные из электронных таблиц в одной папке в мастер-лист. Затем он проверяет и отправляет значения на листы папок, чтобы избежать повторной отправки дубликатов.

Проблема, с которой я сталкиваюсь, заключается в том, что мне приходится делать это с более чем 50k значениями, и может часто ошибки во время выполнения.

Как это можно изменить, чтобы избежать построчного строения?

  function getDataToMaster() {
  var folder = DriveApp.getFolderById("111p5daTNJkyDL5vf0TmiKuqtQBjz8ryL"); //Define id of folder
  var contents = folder.getFiles();
  var file; 
  var data;
  var sheetMaster = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  while(contents.hasNext()){  
    file = contents.next();
    if (file.getMimeType() == "application/vnd.google-apps.spreadsheet") {
      var sheet = SpreadsheetApp.openById(file.getId()).getSheetByName("Sheet1");
      var startRow = 2; 
      var data = sheet.getDataRange().getValues();
      var colToCheck = 6;
      for(var j = 1; j < data.length;j++){
        if(data[j][colToCheck-1] != "copied"){
          sheetMaster.appendRow(data[j]);
          sheet.getRange((j+1), colToCheck).setValue("copied");
          SpreadsheetApp.flush();
        }
      }
    } 
  }
}

1 Ответ

2 голосов
/ 08 февраля 2020
  • Вы хотите уменьшить стоимость процесса для помещения значений в электронную таблицу.
  • Вы хотите улучшить следующую часть.

    for(var j = 1; j < data.length;j++){
      if(data[j][colToCheck-1] != "copied"){
        sheetMaster.appendRow(data[j]);
        sheet.getRange((j+1), colToCheck).setValue("copied");
        SpreadsheetApp.flush();
      }
    }
    

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точка модификации:

  • Чтобы снизить стоимость процесса, описанного выше, я предлагаю использовать setValues вместо appendRow и setValue. Ссылка

Модифицированный скрипт:

Когда ваш скрипт модифицируется, он становится следующим:

С:
for(var j = 1; j < data.length;j++){
  if(data[j][colToCheck-1] != "copied"){
    sheetMaster.appendRow(data[j]);
    sheet.getRange((j+1), colToCheck).setValue("copied");
    SpreadsheetApp.flush();
  }
}
Кому:
var copiedValues = [];
var putValues = [];
for(var j = 1; j < data.length;j++){
  if(data[j][colToCheck-1] != "copied"){
    putValues.push(data[j]);
  }
  copiedValues.push(["copied"]);
}
if (putValues.length > 0) {  // Added
  sheet.getRange(2, colToCheck, copiedValues.length, copiedValues[0].length).setValue(copiedValues);
  sheetMaster.getRange(sheetMaster.getLastRow() + 1, 1, putValues.length, putValues[0].length).setValues(putValues);
}

Ссылки:

I ' я не уверен насчет вашей фактической таблицы. Поэтому, если я неправильно понял ваш вопрос, а это не то направление, которое вам нужно, я прошу прощения.

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