Метод ускорения ВПР для двух файлов CSV, созданных из данных электронной таблицы

Сначала мне нужно дважды VLOOKUP в CSV найти название двух команд, затем я соединяю два имени и делаю еще одну ВПР в другом CSV:

function duoble_vlookup() {
  var s = SpreadsheetApp.getActive();
  var search_values = s.getRange("Import_Data!K2:K3").getValues();

  var teams_url = 'url csv 1';
  var teams_csv = Utilities.parseCsv(UrlFetchApp.fetch(teams_url));
  
  var match_col = teams_csv.map(row => row[0]);
  var match_list = match_col.join("ღ").split("ღ");

  var index = match_list.indexOf(search_values[0][0]);
  if (index === -1) {
    var team_home = 'off';
  } else {
    var row = index;
    var found_value = teams_csv[row][1];
    var team_home = found_value;
  }
  
  var index = match_list.indexOf(search_values[1][0]);
  if (index === -1) {
    var team_away = 'off';
  } else {
    var row = index;
    var found_value = teams_csv[row][1];
    var team_away = found_value;
  }
  
  var match_name = team_home + ' v ' + team_away;
  
  var all_values_csv_url = 'url csv 2';
  var all_values_csv = Utilities.parseCsv(UrlFetchApp.fetch(all_values_csv_url));
  var match_col = all_values_csv.map(row => row[2]);
  var match_list = match_col.join("ღ").split("ღ");
  var index = match_list.indexOf(match_name);
  if (index === -1) {
    s.getRange("Gerais!B420:F420").setValues([['-','-','-','-','-']]);
  } else {
    var row = index;
    var found_value = [[all_values_csv[row][5],all_values_csv[row][6],all_values_csv[row][7],all_values_csv[row][8],all_values_csv[row][9]]];
    s.getRange("Gerais!B420:F420").setValues(found_value);
  }
}

Эта работа занимает от 28 до 45 секунд, есть ли более гибкий метод для этого или это действительно реальность этого случая?

Например к тестам:

Import_Data!K2:K3:

/95/
/117/

Результат в Gerais!B420:F420:

B420С420Д420Е420F420
24,53,451,952.02

Можете ли вы предоставить образец входных данных CSV и образец ожидаемой ситуации вывода?

Tanaike 11.05.2022 01:04

Кстати, я думаю, что var match_col = teams_csv.map(row => row[0]); и var match_list = match_col.join("ღ").split("ღ"); это одно и то же. Могу я спросить вас об ожидаемом результате здесь?

Tanaike 11.05.2022 01:14

Привет @Tanaike Да, я могу это сделать, я отредактирую контент, чтобы скрыть то, чем нельзя поделиться, и отправлю ссылки, чтобы помочь вам увидеть!

Brondby IF 11.05.2022 01:20

@Tanaike Идея на этом этапе кода состоит в том, чтобы просто создать единый список для поиска по индексу, я считаю, что оба действительно выполняют одну и ту же работу, я только что заметил, что вы комментируете!

Brondby IF 11.05.2022 01:21

Привет @Tanaike csv, включенный в вопрос, и образцы тестовых данных также включены, обратите внимание, что иногда, когда я запускаю этот скрипт более одного раза с одними и теми же значениями, он иногда запускается менее чем за 10 секунд, но это не нормально в моем триггере, который работает каждые 30 минут это занимает гораздо больше времени, чем когда вам нужно провести новое исследование.

Brondby IF 11.05.2022 01:33

Спасибо за ответ. Угадав вашу ситуацию, я предложил в качестве ответа модифицированный скрипт. Не могли бы вы подтвердить это? Если это было не полезно, прошу прощения. В то время я подумал, что может потребоваться протестировать скрипт на примере данных CSV.

Tanaike 11.05.2022 01:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что ваша цель заключается в следующем.

  • Вы хотите снизить стоимость обработки вашего сценария.

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

  • Когда вместо оператора if используется тернарный оператор, стоимость процесса может немного снизиться. Ссылка
  • Как я уже упоминал в своем комментарии, в вашем сценарии var match_col = teams_csv.map(row => row[0]); и var match_list = match_col.join("ღ").split("ღ"); — это один и тот же результат.
  • Я подумал, что при использовании UrlFetchApp.fetchAll вместо UrlFetchApp.fetch стоимость процесса может быть немного снижена. Ссылка

Когда эти моменты отражаются на вашем сценарии, он становится следующим.

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

function duoble_vlookup() {
  var s = SpreadsheetApp.getActive();
  var search_values = s.getRange("Import_Data!K2:K3").getValues();

  var teams_url = 'url csv 1';
  var all_values_csv_url = 'url csv 2';
  var [teams_csv, all_values_csv] = UrlFetchApp.fetchAll([teams_url, all_values_csv_url]).map(r => Utilities.parseCsv(r.getContentText()));

  var match_col1 = teams_csv.map(row => row[0]);
  var index1 = match_col1.indexOf(search_values[0][0]);
  var index2 = match_col1.indexOf(search_values[1][0]);
  var team_home = index1 === -1 ? 'off' : teams_csv[index1][1];
  var team_away = index2 === -1 ? 'off' : teams_csv[index2][1];
  var match_name = team_home + ' v ' + team_away;

  var match_col2 = all_values_csv.map(row => row[2]);
  var index = match_col2.indexOf(match_name);
  var values = index === -1 ? [['-', '-', '-', '-', '-']] : [[all_values_csv[index][5], all_values_csv[index][6], all_values_csv[index][7], all_values_csv[index][8], all_values_csv[index][9]]];
  s.getRange("Gerais!B420:F420").setValues(values);
}

Примечание:

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

Рекомендации:

Он генерирует ошибку, например: Exception: invalid argument (line 7) строка 7 — это var [teams_csv, all_values_csv] = ..., это метод fetchAll?

Brondby IF 11.05.2022 01:40

@Brondby, ЕСЛИ Спасибо за ответ. Я должен извиниться. Я неправильно скопировал сценарий. Это var [teams_csv, all_values_csv] = UrlFetchApp.fetchAll([teams_url, all_values_csv_url]).map(r => Utilities.parseCsv(r.getContentText()));. Пожалуйста, проверьте это снова.

Tanaike 11.05.2022 01:50

Я позволю ему работать в моем триггере, но я уже заметил огромную разницу в ответе → 2013 секунд общего пробега, 2 секунды против 45 секунд, огромная разница!

Brondby IF 11.05.2022 01:53

@Brondby IF Спасибо за ответ и тестирование. Я рад, что ваша проблема была решена. И тебе спасибо.

Tanaike 11.05.2022 01:55

Другие вопросы по теме