加速从电子表格数据创建的两个 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 数据测试脚本。
参考文献:
首先我需要在 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 ofUrlFetchApp.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 数据测试脚本。