[英]Google Apps Script Inner Join Ranges
我想通過“ ID”“內部加入” 2個數據范圍(SHEET 1和2),並在SHEET 3中輸出其結果(如下所示)
對於所有工作表,第一行只是標題,實際值從第二行開始。
工作表1是整個數據庫(3000行),工作表2(1000行)是具有附加數據的工作表1的選擇。 每個條目(ID)在每個工作表中僅出現一次。
工作表3應該僅包含工作表2的行,但應包含工作表1的相應行(按ID)的數據。
var sheetOneVals = sheetOne.getDataRange().getValues(); sheetOneVals.splice(0, 1);
var sheetTwoVals = sheetTwo.getDataRange().getValues(); sheetTwoVals.splice(0, 1);
如何才能做到這一點? 我幾乎想要的是https://stackoverflow.com/a/17500836/379777 ,但它使用的是Keys,在我的情況下我沒有。
清單1:
A B C D
------------------------------------
1 | Name | Description | Price | ID |
------------------------------------
2 | ABC | Bla1 | 10 | 123 |
------------------------------------
3 | DEF | Bla2 | 8 | 234 |
------------------------------------
: | : | : | : | : |
: | : | : | : | : |
------------------------------------
表格2:
A B C D E
---------------------------------------
1 | ID | Cat1 | Cat2 | Cat3 | Nonsense |
---------------------------------------
2 | 123 | B | C | D | xyz |
---------------------------------------
: | : | : | : | : | : |
: | : | : | : | : | : |
---------------------------------------
表格3(預期結果):
A B C D E F G
----------------------------------------------------------
1 | ID | Cat1 | Cat2 | Cat3 | Name | Description | Price |
----------------------------------------------------------
2 | 123 | B | C | D | ABC | Bla1 | 10 |
----------------------------------------------------------
: | : | : | : | : | : | : | : |
: | : | : | : | : | : | : | : |
----------------------------------------------------------
您只需要邏輯還是有人來編寫所有代碼? 容易而快速地工作的邏輯是:
以Key為ID的Start和object。
迭代槽板1並將所有值另存為這些ID中的對象。
迭代槽板2,再次在ID中保存新密鑰。
將對象解析為Double Array。
這是一些存根:
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
只需將Heading插入某處,可以在Initialization中,在第一個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);}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.