Java оптимизация скрипта для скрипта приложений Google - PullRequest
1 голос
/ 03 марта 2020

У меня есть рабочий код ниже, который сравнивает два набора данных из двух разных листов. Один из них - это список из 395 телефонных номеров, второй - список из примерно 135 000 строк данных. Следующий код сравнивает их по сходству и копирует похожую строку на третий лист.

Хотя код работает для небольших тестов (1000 строк и 395 телефонных номеров) примерно за 10 минут. Однако выполнение 135 000 строк приводит к превышению времени ожидания сценария. Вот сценарий ниже.

`function copyRowtoSheet3() { 
  var s1 = SpreadsheetApp.openById("1Aw11LiKzyezfrTQIuTsJPhUFtz8RPqLCc8FlIiy0ZlE").getSheetByName('Sheet1');
  var s2 = SpreadsheetApp.openById("1Aw11LiKzyezfrTQIuTsJPhUFtz8RPqLCc8FlIiy0ZlE").getSheetByName('Sheet2'); 
  var s3 = SpreadsheetApp.openById("1Aw11LiKzyezfrTQIuTsJPhUFtz8RPqLCc8FlIiy0ZlE").getSheetByName('Sheet3'); 
  var values1 = s1.getDataRange().getValues();
  var values2 = s2.getDataRange().getValues();
  var resultArray = [];
  for(var n=0; n < values1.length ; n++){
    var keep = false;
    for(var p=0; p < values2.length ; p++){
      Logger.log(values1[n][0]+' =? '+values2[p][0]);
      if( values1[n][1] == values2[p][0] ){
        resultArray.push(values1[n]);
        Logger.log('true');
        //break ;
      }
    }
  }  
  s3.getRange(+1,1,resultArray.length,resultArray[0].length).setValues(resultArray);
}`

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

1 Ответ

3 голосов
/ 03 марта 2020
  • Требуется сравнить столбец «B» «Лист1» и столбец «А» «Лист2».
  • При значениях столбца «В» «Лист1» и столбец «A» для «Sheet2» совпадает, вы хотите поместить строку «Sheet1» в «Sheet3».
  • Вы хотите уменьшить стоимость процесса сценария.
  • Вы хотите добиться этого с помощью Google Apps Script.

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

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

  • Пожалуйста, используйте SpreadsheetApp.openById("1Aw11LiKzyezfrTQIuTsJPhUFtz8RPqLCc8FlIiy0ZlE") один раз.
  • В вашем случае, values2 используется в течение l oop. Таким образом, values2 зацикливается на каждом элементе values1.
    • Для этого объект подготовлен для поиска значений.
  • Если длина resultArray велика, стоимость процесса можно уменьшить с помощью API Sheets вместо Служба электронных таблиц, как SpreadsheetApp. Ref

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

Поток:
  1. Получите значения из «Sheet1» и « Sheet2 ",
  2. Создать объект, используя values2.
  3. Создать resultArray, используя values1 и объект.
  4. Поместить resultArray в" Sheet3 ", используя метод spreadsheets.values.update в Sheets API.

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

Перед использованием этого скрипта включите Sheets API в службах Advanced Google.

function copyRowtoSheet3() {
  var spreadsheetId = "1Aw11LiKzyezfrTQIuTsJPhUFtz8RPqLCc8FlIiy0ZlE";
  var ss = SpreadsheetApp.openById(spreadsheetId);
  var s1 = ss.getSheetByName('Sheet1');
  var s2 = ss.getSheetByName('Sheet2');

  // 1. Retrieve values from "Sheet1" and "Sheet2",
  var values1 = s1.getDataRange().getValues();
  var values2 = s2.getRange(1, 1, s2.getLastRow(), 1).getValues();

  // 2. Create an object using values2.
  var obj = values2.reduce((o, [e]) => {
    o[e] = null;
    return o;
  }, {});

  // 3. Create resultArray using values1 and obj.
  var resultArray = values1.filter(([,b]) => b in obj);

  // 4. Put resultArray to Sheet3.
  Sheets.Spreadsheets.Values.update({values: resultArray}, spreadsheetId, "Sheet3", {valueInputOption: "USER_ENTERED"});
}

Примечание:

  • В этом случае, пожалуйста, включите V8 в редакторе скриптов.

Ссылки:

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.

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