I have 3 different sheets in my spreadsheet that I need some specific columns to be combined into a new one. The sheets are as follow:
Sheet 1
Column Needed A | Alliance Mapped |
---|---|
id123 | Alliance 1 |
id8952 | Alliance 2 |
id4521 | Alliance 3 |
Sheet 2
Alliances | trash column 1 | trash column 2 | identifier |
---|---|---|---|
Alliance 4 | test | some data | id45215 |
Alliance 5 | test | some data | id454421 |
Alliance 6 | test | some data | id45231 |
Sheet 3
trash column | number | trash column | organization |
---|---|---|---|
some data | id41542 | some data | Alliance 7 |
some data | id41 | some data | Alliance 8 |
some data | id985 | some data | Alliance 10 |
So basically what I need to is to make like an union between the 3 sheets mentioned above, so in the final sheet it will look something like this:
id | alliance |
---|---|
id123 | Alliance1 |
id8952 | Alliance 2 |
id4521 | Alliance 3 |
id45215 | Alliance 4 |
etc | etc |
I have created this script for getting data out off sheet 2:
function copySheet() {
var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
var destSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet Final");
var columns_to_be_copied = [4,1];
for (var i = 0; i < columns_to_be_copied.length; i ) {
var sourcerange = sourceSheet.getRange(2, columns_to_be_copied[i], sourceSheet.getLastRow()-1,1)
sourcerange.copyTo(destSheet.getRange(1,(i 1)))
}
}
But I don't know how to recreate this on a single code for the other sheets? Is there any way that it can be done?
CodePudding user response:
Get id and alliances
function combine() {
const ss = SpreadsheetApp.getActive();
const osh = ss.getSheetByName("Sheet0")
const shts = ["Sheet1","Sheet2","Sheet3"];
const sObj = {"Sheet1":{id:1,alliance:2},"Sheet2":{id:4,alliance:1},"Sheet3":{id:2,alliance:4}}
let oA=[["ID","Alliance"]];
ss.getSheets().filter(sh => ~shts.indexOf(sh.getName())).forEach(sh => {
let n = sh.getName();
sh.getRange(2,1,sh.getLastRow() - 1,sh.getLastColumn()).getValues().forEach(r => oA.push([r[sObj[n].id-1],r[sObj[n].alliance-1]]))
});
osh.clearContents();
osh.getRange(1,1,oA.length,oA[0].length).setValues(oA);
}
Output:
ID | Alliance |
---|---|
id123 | Alliance 1 |
id8952 | Alliance 2 |
id4521 | Alliance 3 |
id45215 | Alliance 4 |
id454421 | Alliance 5 |
id45231 | Alliance 6 |
id41542 | Alliance 7 |
id41 | Alliance 8 |
id985 | Alliance 10 |
CodePudding user response:
Create a configuration object with the columns needed.
Manipulate the array using methods like Array.map
const getData = () => {
const config = {
Sheet1: { id: 1, alliance: 2 },
Sheet2: { id: 4, alliance: 2 },
},
ss = SpreadsheetApp.getActive(),
sheets = Object.keys(config),
data = sheets.flatMap((name) =>
ss
.getSheetByName(name)
.getDataRange()
.getValues()
.map((row) => [row[config[name].id-1], row[config[name].alliance-1]])
),
outputsheet = 'Sheet[out]';
ss.getSheetByName(outputsheet).getRange(1, 1, data.length, 2).setValues(data);
};