加速从电子表格数据创建的两个 CSV 文件的 VLOOKUP 的方法

Method to speed up a VLOOKUP on two CSV files created from spreadsheet data

首先我需要在 CSV 中 VLOOKUP 两次以找到两个团队的名称,然后我加入这两个名称并在另一个 CSV 中执行另一个 VLOOKUP:

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 C420 D420 E420 F420
2 4.5 3.45 1.95 2.02

我相信你的目标如下。

  • 您想降低脚本的处理成本。

修改点:

  • 当使用三元运算符代替if语句时,可以减少一些处理成本。 Ref
  • 正如我在评论中提到的,在您的脚本中,var match_col = teams_csv.map(row => row[0]);var match_list = match_col.join("ღ").split("ღ"); 是相同的结果。
  • 我觉得用UrlFetchApp.fetchAll insted of UrlFetchApp.fetch时,工艺成本可以降低一点。 Ref

当这些点反映到你的脚本中,就变成了下面这样。

修改后的脚本:

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 数据测试脚本。

参考文献: