如何在 google 工作表 Apps 脚本中对以逗号分隔的多个数据进行 vlookup?
How to do a vlookup for multiple data separated by comma in google sheets Apps script?
我有 google sheet 来创建 vlookup。
Sheet 1
G
H
1
Categories
Category ID
2
ab, ac, bd
3
ac
4
av, ab
Sheet 2
A
B
C
Category
Category slug
category Id
ab
/ab/
1
ac
/ac
2
av
/av
3
我想进行如下所示的 vlookup。
G
H
1
Categories
Category ID
2
ab, ac, bd
1,2,bd
3
ac
2
4
av, ab
3,1
要求是:
- 映射/为单元格中的所有数据创建 vlookup
- 在 vlookup 数据不可用的地方反转相同的数据
我试图在脚本编辑器中创建一个函数。但是事情并没有像我预期的那样发展。
function replace_category_with_id(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("T");
var total = sheet.getLastRow();
var range = sheet.getRange(2,7,total,1);
var values = range.getValues();
var asheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("A");
var atotal = asheet.getLastRow();
var arange = asheet.getRange(2,1,atotal-1,3);
var avalues = arange.getValues();
//Create an array variable result
var results =[{}];
//Run a for loop for the values in the T Spreadsheet
for(var i=0; i<values.length-1; i++)
{
//Split multiple data in a cell
var splitdata = values[i].toString().split(",");
//Search if the individual data in splitdata is available
for(var count=0; count<(splitdata.length); count++)
{
//Create a flag to check if the search has found the data
var flag = 0;
for(var n=0; n<avalues.length-1;n++)
{
//Logger.log(avalues[n]);
if(splitdata[count] == avalues[n][0])
{
Logger.log(i);
Logger.log(count);
Logger.log(n);
//results[i][count] = avalues[n][2];
flag = 1;
}
}
if(flag==0)
{
results[i][count] = splitdata[count];
}
}
//Logger.log(values[i]);
}
//Display Results array
for(var i=0; i<=results.length; i++)
{
Logger.log(results[i]);
}
}
我对您的代码进行了一些修改,并为每个过程添加了注释。
试试这个:
function replace_category_with_id(){
//Retrieve Sheet1 data
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var total = sheet1.getLastRow();
var range = sheet1.getRange(2,7,total-1,1);
var sheet1_values = range.getValues();
//Retrieve Sheet2 data
var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
var atotal = sheet2.getLastRow();
var arange = sheet2.getRange(2,1,atotal-1,3);
var sheet2_values = arange.getValues();
//Sheet2: Create object as lookup
var lookup = {};
sheet2_values.forEach(element => {
//Push each element and use Category as key and Category ID as value
lookup[element[0]] = element[2]
})
var result = [];
sheet1_values.forEach(element => {
//Sheet1: Split each categories in the first column.
var val = element[0].toString().split(",");
var val_str = [];
val.forEach(element2 => {
//Sheet1: Check if Category exists in lookup, if not use Category
if(lookup.hasOwnProperty(element2)){
val_str.push(lookup[element2])
}else{
val_str.push(element2);
}
})
//Combine results in an Array
result.push([val_str.join(",")])
})
//Set values to sheets using the combined results.
sheet1.getRange(2,8,total-1,1).setValues(result);
}
这是我的示例数据:
(我添加了一些测试数据来检查逻辑是否正常工作)
工作表 1
之前:
之后:
Sheet2
我有 google sheet 来创建 vlookup。
Sheet 1
G | H | |
---|---|---|
1 | Categories | Category ID |
2 | ab, ac, bd | |
3 | ac | |
4 | av, ab |
Sheet 2
A | B | C |
---|---|---|
Category | Category slug | category Id |
ab | /ab/ | 1 |
ac | /ac | 2 |
av | /av | 3 |
我想进行如下所示的 vlookup。
G | H | |
---|---|---|
1 | Categories | Category ID |
2 | ab, ac, bd | 1,2,bd |
3 | ac | 2 |
4 | av, ab | 3,1 |
要求是:
- 映射/为单元格中的所有数据创建 vlookup
- 在 vlookup 数据不可用的地方反转相同的数据
我试图在脚本编辑器中创建一个函数。但是事情并没有像我预期的那样发展。
function replace_category_with_id(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("T");
var total = sheet.getLastRow();
var range = sheet.getRange(2,7,total,1);
var values = range.getValues();
var asheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("A");
var atotal = asheet.getLastRow();
var arange = asheet.getRange(2,1,atotal-1,3);
var avalues = arange.getValues();
//Create an array variable result
var results =[{}];
//Run a for loop for the values in the T Spreadsheet
for(var i=0; i<values.length-1; i++)
{
//Split multiple data in a cell
var splitdata = values[i].toString().split(",");
//Search if the individual data in splitdata is available
for(var count=0; count<(splitdata.length); count++)
{
//Create a flag to check if the search has found the data
var flag = 0;
for(var n=0; n<avalues.length-1;n++)
{
//Logger.log(avalues[n]);
if(splitdata[count] == avalues[n][0])
{
Logger.log(i);
Logger.log(count);
Logger.log(n);
//results[i][count] = avalues[n][2];
flag = 1;
}
}
if(flag==0)
{
results[i][count] = splitdata[count];
}
}
//Logger.log(values[i]);
}
//Display Results array
for(var i=0; i<=results.length; i++)
{
Logger.log(results[i]);
}
}
我对您的代码进行了一些修改,并为每个过程添加了注释。
试试这个:
function replace_category_with_id(){
//Retrieve Sheet1 data
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var total = sheet1.getLastRow();
var range = sheet1.getRange(2,7,total-1,1);
var sheet1_values = range.getValues();
//Retrieve Sheet2 data
var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
var atotal = sheet2.getLastRow();
var arange = sheet2.getRange(2,1,atotal-1,3);
var sheet2_values = arange.getValues();
//Sheet2: Create object as lookup
var lookup = {};
sheet2_values.forEach(element => {
//Push each element and use Category as key and Category ID as value
lookup[element[0]] = element[2]
})
var result = [];
sheet1_values.forEach(element => {
//Sheet1: Split each categories in the first column.
var val = element[0].toString().split(",");
var val_str = [];
val.forEach(element2 => {
//Sheet1: Check if Category exists in lookup, if not use Category
if(lookup.hasOwnProperty(element2)){
val_str.push(lookup[element2])
}else{
val_str.push(element2);
}
})
//Combine results in an Array
result.push([val_str.join(",")])
})
//Set values to sheets using the combined results.
sheet1.getRange(2,8,total-1,1).setValues(result);
}
这是我的示例数据: (我添加了一些测试数据来检查逻辑是否正常工作) 工作表 1
之前:
之后:
Sheet2