Google Apps 脚本内部连接范围
Google Apps Script Inner Join Ranges
我想"inner join" 2 data-ranges (SHEET 1 & 2) by "ID" 并将其结果输出到SHEET 3 (如图下)
对于所有工作表,第一行只有header,实际值从第二行开始。
Sheet 1 是整个数据库(3000 行),Sheet 2(1000 行)是 Sheet 1 的选择以及附加数据。每个条目 (ID) 在 Sheet.
中只出现一次
Sheet 3 应该显示仅包含 Sheet 2 的行,但包含 Sheet 1.Sheet 对应行(按 ID)的数据。
var sheetOneVals = sheetOne.getDataRange().getValues();
sheetOneVals.splice(0, 1);
var sheetTwoVals = sheetTwo.getDataRange().getValues();
sheetTwoVals.splice(0, 1);
如何做到这一点?
几乎是我想要的,只是它使用了 Keys,而我的情况下没有。
SHEET 1:
A B C D
------------------------------------
1 | Name | Description | Price | ID |
------------------------------------
2 | ABC | Bla1 | 10 | 123 |
------------------------------------
3 | DEF | Bla2 | 8 | 234 |
------------------------------------
: | : | : | : | : |
: | : | : | : | : |
------------------------------------
SHEET 2:
A B C D E
---------------------------------------
1 | ID | Cat1 | Cat2 | Cat3 | Nonsense |
---------------------------------------
2 | 123 | B | C | D | xyz |
---------------------------------------
: | : | : | : | : | : |
: | : | : | : | : | : |
---------------------------------------
SHEET 3(期望的结果):
A B C D E F G
----------------------------------------------------------
1 | ID | Cat1 | Cat2 | Cat3 | Name | Description | Price |
----------------------------------------------------------
2 | 123 | B | C | D | ABC | Bla1 | 10 |
----------------------------------------------------------
: | : | : | : | : | : | : | : |
: | : | : | : | : | : | : | : |
----------------------------------------------------------
您只需要逻辑还是需要有人编写代码?简单快速的逻辑是:
启动并object,以Key为ID。
遍历 sheet 1 并将所有值保存为这些 ID 中的 objects。
迭代槽 sheet 2 再次保存新密钥,在 ID 中。
将 object 解析为双精度数组。
这是一些存根:
Initiate myObject
Get Sheet1 and sheet2
for( lines in sheet 1 )
myObject[ lineId ] = {}
for( cols in sheet 1[lines] )
myObject[ lineId ][ columnHeading ] = columnValue
for( lines in sheet 2 )
for( cols in sheet 1[lines] )
myObject[ lineId ][ columnHeading ] = columnValue
你最终会得到一个重复的 ID,因为 属性 键和其中的 属性 值,但没什么大不了的。
Initiate arrayToPaste
Initiate currLine with 0
for( props in myObject )
Initiate first array key as an Array
for( keys in myObject[ props ] ){
arrayToPaste[ currLine ].push(myObject[ props ][ key ])
}
Increase currLine
Paste arrayToPaste to sheet
只需在某处插入标题,可以在初始化中,在第一个for之后,粘贴时,作为不同的数组等...
我也有一个问题,为什么是 parseInt?
我最终得到了以下解决方案。我可能不够好,无法完全理解您的解决方案。我相信您的解决方案要快得多。
function createSheet3(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss.getSheetByName("sheet1");
var sheet2 = ss.getSheetByName("sheet2");
var sheet3 = ss.getSheetByName("sheet3");
var sheet3Header = [Name,Description,Price,ID,ID,Cat1,Cat2,Cat3,Nonsense]
var sheetOneVals = sheet1.getDataRange().getValues();
sheetOneVals.splice(0, 1);
var sheetTwoVals = sheet2.getDataRange().getValues();
sheetTwoVals.splice(0, 1);
var consolidatedArr = new Array();
for each (var item in sheetTwoVals){
for (var i in sheetOneVals) {
if(item[0] == sheetOneVals[i][3]){
consolidatedArr.push(sheetOneVals[i].concat(item));
}
}
}
sheet3.clear({contentsOnly:true});
sheet3.getRange(1,1,1,9).setValues(sheet3Header);
sheet3.getRange(2,1,consolidatedArr.length,9).setValues(consolidatedArr);
SpreadsheetApp.flush();
Utilities.sleep("200");
if(consolidatedArr.length > 0){
var last = sheet3.getLastRow();
var max = sheet3.getMaxRows();
if (last !== max && max-last > 1) {sheet3.deleteRows(last+2,max-last-1);}
}
}
我想"inner join" 2 data-ranges (SHEET 1 & 2) by "ID" 并将其结果输出到SHEET 3 (如图下)
对于所有工作表,第一行只有header,实际值从第二行开始。
Sheet 1 是整个数据库(3000 行),Sheet 2(1000 行)是 Sheet 1 的选择以及附加数据。每个条目 (ID) 在 Sheet.
中只出现一次Sheet 3 应该显示仅包含 Sheet 2 的行,但包含 Sheet 1.Sheet 对应行(按 ID)的数据。
var sheetOneVals = sheetOne.getDataRange().getValues();
sheetOneVals.splice(0, 1);
var sheetTwoVals = sheetTwo.getDataRange().getValues();
sheetTwoVals.splice(0, 1);
如何做到这一点? 几乎是我想要的,只是它使用了 Keys,而我的情况下没有。
SHEET 1:
A B C D
------------------------------------
1 | Name | Description | Price | ID |
------------------------------------
2 | ABC | Bla1 | 10 | 123 |
------------------------------------
3 | DEF | Bla2 | 8 | 234 |
------------------------------------
: | : | : | : | : |
: | : | : | : | : |
------------------------------------
SHEET 2:
A B C D E
---------------------------------------
1 | ID | Cat1 | Cat2 | Cat3 | Nonsense |
---------------------------------------
2 | 123 | B | C | D | xyz |
---------------------------------------
: | : | : | : | : | : |
: | : | : | : | : | : |
---------------------------------------
SHEET 3(期望的结果):
A B C D E F G
----------------------------------------------------------
1 | ID | Cat1 | Cat2 | Cat3 | Name | Description | Price |
----------------------------------------------------------
2 | 123 | B | C | D | ABC | Bla1 | 10 |
----------------------------------------------------------
: | : | : | : | : | : | : | : |
: | : | : | : | : | : | : | : |
----------------------------------------------------------
您只需要逻辑还是需要有人编写代码?简单快速的逻辑是:
启动并object,以Key为ID。
遍历 sheet 1 并将所有值保存为这些 ID 中的 objects。
迭代槽 sheet 2 再次保存新密钥,在 ID 中。
将 object 解析为双精度数组。
这是一些存根:
Initiate myObject
Get Sheet1 and sheet2
for( lines in sheet 1 )
myObject[ lineId ] = {}
for( cols in sheet 1[lines] )
myObject[ lineId ][ columnHeading ] = columnValue
for( lines in sheet 2 )
for( cols in sheet 1[lines] )
myObject[ lineId ][ columnHeading ] = columnValue
你最终会得到一个重复的 ID,因为 属性 键和其中的 属性 值,但没什么大不了的。
Initiate arrayToPaste
Initiate currLine with 0
for( props in myObject )
Initiate first array key as an Array
for( keys in myObject[ props ] ){
arrayToPaste[ currLine ].push(myObject[ props ][ key ])
}
Increase currLine
Paste arrayToPaste to sheet
只需在某处插入标题,可以在初始化中,在第一个for之后,粘贴时,作为不同的数组等...
我也有一个问题,为什么是 parseInt?
我最终得到了以下解决方案。我可能不够好,无法完全理解您的解决方案。我相信您的解决方案要快得多。
function createSheet3(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss.getSheetByName("sheet1");
var sheet2 = ss.getSheetByName("sheet2");
var sheet3 = ss.getSheetByName("sheet3");
var sheet3Header = [Name,Description,Price,ID,ID,Cat1,Cat2,Cat3,Nonsense]
var sheetOneVals = sheet1.getDataRange().getValues();
sheetOneVals.splice(0, 1);
var sheetTwoVals = sheet2.getDataRange().getValues();
sheetTwoVals.splice(0, 1);
var consolidatedArr = new Array();
for each (var item in sheetTwoVals){
for (var i in sheetOneVals) {
if(item[0] == sheetOneVals[i][3]){
consolidatedArr.push(sheetOneVals[i].concat(item));
}
}
}
sheet3.clear({contentsOnly:true});
sheet3.getRange(1,1,1,9).setValues(sheet3Header);
sheet3.getRange(2,1,consolidatedArr.length,9).setValues(consolidatedArr);
SpreadsheetApp.flush();
Utilities.sleep("200");
if(consolidatedArr.length > 0){
var last = sheet3.getLastRow();
var max = sheet3.getMaxRows();
if (last !== max && max-last > 1) {sheet3.deleteRows(last+2,max-last-1);}
}
}