Vlookup + indexOf 通过 Google App 脚本在 CSV 中查找值而不使用循环
Vlookup + indexOf to find values in a CSV via Google App Script without using loop
主要思想是不需要循环生成 VLOOKUP
因为当数据量很大时它会产生巨大的减速。
直接在sheet中对数据进行VLOOKUP我是这样操作的:
function myFunction() {
var s = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var searchValue = s.getRange("Test!A1").getValue();
var data = SpreadsheetApp.openById("XXXXXXXXXXXX").getSheetByName("Test 2");
var dataValues = data.getRange("A1:A").getValues();
var dataList = dataValues.join("ღ").split("ღ");
var index = dataList.indexOf(searchValue);
if (index === -1) {
s.getRange("Test!B1").setValue('off');
} else {
var row = index + 1;
var foundValue = data.getRange("D"+row).getValue();
s.getRange("Test!B1").setValue(foundValue);
}
}
但是这个方法有一个很大的问题,因为当很多不同的账户试图同时访问这个sheet时,有时会出现错误type error: could not connect sheet xxxxx
或者造成巨大的延迟。
那么我找到的解决方案是什么?将 spreadsheet 页面发布为 CSV 格式以便使用,并且当许多帐户调用相同的 spreadsheet.
时不会发生此错误
目前,当我导入包含多列数据的 CSV 时,我还没有找到使用第一列的 indexOf
方法,所以我只能创建一个 spreadsheet 页面使用 A 列的复制数据,然后我得到了 VLOOKUP
的最终结果,如下所示:
(在本例中 var searchValue
中的值将是 two
)
function myFunction() {
var s = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var url_columnA = 'AAAAA';
var url_vlookup = 'BBBBB';
var dataSearch = Utilities.parseCsv(UrlFetchApp.fetch(url_columnA));
var dataList = dataSearch.join("ღ").split("ღ");
var searchValue = s.getRange("Test!A1").getValue();
var index = dataList.indexOf(searchValue);
if (index === -1) {
s.getRange("Test!B1").setValue('off');
} else {
var row = index;
var dataVlookup = Utilities.parseCsv(UrlFetchApp.fetch(url_vlookup));
var foundValue = dataVlookup[row][3];
s.getRange("Test!B1").setValue(foundValue);
}
}
Return 例子:
other number
var url_vlookup
:
Col A
Col B
Col C
Col D
home
1
a
win
away
2
b
loose
one
3
c
number
two
4
d
other number
three
5
e
number again?
var url_columnA
:
Col A
home
away
one
two
three
有没有什么方法可以处理 var url_vlookup
数据以搜索 A 列中的值,这样就不必使用此页 var url_columnA
分隔,或者这是不循环的唯一方法?
使用 Array.map:
解析后可以很容易地分隔第一列
const dataVlookup = Utilities.parseCsv(UrlFetchApp.fetch(url_vlookup));
const url_columnA = dataVlookup.map(row => row[0])
主要思想是不需要循环生成 VLOOKUP
因为当数据量很大时它会产生巨大的减速。
直接在sheet中对数据进行VLOOKUP我是这样操作的:
function myFunction() {
var s = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var searchValue = s.getRange("Test!A1").getValue();
var data = SpreadsheetApp.openById("XXXXXXXXXXXX").getSheetByName("Test 2");
var dataValues = data.getRange("A1:A").getValues();
var dataList = dataValues.join("ღ").split("ღ");
var index = dataList.indexOf(searchValue);
if (index === -1) {
s.getRange("Test!B1").setValue('off');
} else {
var row = index + 1;
var foundValue = data.getRange("D"+row).getValue();
s.getRange("Test!B1").setValue(foundValue);
}
}
但是这个方法有一个很大的问题,因为当很多不同的账户试图同时访问这个sheet时,有时会出现错误type error: could not connect sheet xxxxx
或者造成巨大的延迟。
那么我找到的解决方案是什么?将 spreadsheet 页面发布为 CSV 格式以便使用,并且当许多帐户调用相同的 spreadsheet.
时不会发生此错误目前,当我导入包含多列数据的 CSV 时,我还没有找到使用第一列的 indexOf
方法,所以我只能创建一个 spreadsheet 页面使用 A 列的复制数据,然后我得到了 VLOOKUP
的最终结果,如下所示:
(在本例中 var searchValue
中的值将是 two
)
function myFunction() {
var s = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var url_columnA = 'AAAAA';
var url_vlookup = 'BBBBB';
var dataSearch = Utilities.parseCsv(UrlFetchApp.fetch(url_columnA));
var dataList = dataSearch.join("ღ").split("ღ");
var searchValue = s.getRange("Test!A1").getValue();
var index = dataList.indexOf(searchValue);
if (index === -1) {
s.getRange("Test!B1").setValue('off');
} else {
var row = index;
var dataVlookup = Utilities.parseCsv(UrlFetchApp.fetch(url_vlookup));
var foundValue = dataVlookup[row][3];
s.getRange("Test!B1").setValue(foundValue);
}
}
Return 例子:
other number
var url_vlookup
:
Col A | Col B | Col C | Col D |
---|---|---|---|
home | 1 | a | win |
away | 2 | b | loose |
one | 3 | c | number |
two | 4 | d | other number |
three | 5 | e | number again? |
var url_columnA
:
Col A |
---|
home |
away |
one |
two |
three |
有没有什么方法可以处理 var url_vlookup
数据以搜索 A 列中的值,这样就不必使用此页 var url_columnA
分隔,或者这是不循环的唯一方法?
使用 Array.map:
解析后可以很容易地分隔第一列const dataVlookup = Utilities.parseCsv(UrlFetchApp.fetch(url_vlookup));
const url_columnA = dataVlookup.map(row => row[0])