1
votes

Comment fusionner plusieurs tableaux 2D avec des longueurs différentes dans un grand tableau pour l'afficher dans des feuilles de calcul Google?

Je travaille avec différents tableaux 2D (lignes et colonnes, script d'application google). Par exemple (r = row, c = column):

var array1and2 = 
[[r1c1, r1c2, r1c3, r1c4, r1c5], 
 [r2c1, r2c2, r2c3, r2c4, r2c5], 
 [empty, empty, empty, r3c4, r4c5]
]

et je veux l'avoir comme ça:

var array1 = 
[[r1c1, r1c2, r1c3], 
 [r2c1, r2,c2, r2c2]]

var array2 = 
[[r1c4, r1c5], 
[r2c4, r2c5], 
[r3c4, r3c5]]

Ça ne marche pas ' t doit être vide mais comme déjà dit je veux l'afficher dans des feuilles de calcul google. Le deuxième tableau doit être dans la première ligne et colonne vides à côté du premier tableau.
J'espère que c'est compréhensible et merci beaucoup pour votre aide!


1 commentaires

Que diriez-vous de ceci: array2.map ((elem, i) => [... (array1 [i] || new Array (array1 [0] .length) .fill ('empty')), .. .elem])


3 Réponses :


5
votes

Vous pouvez faire quelque chose comme ça:

var array2 = [['r1c4', 'r1c5'],
['r2c4', 'r2c5'],
['r3c4', 'r3c5']];

var array1 = [['r1c1', 'r1c2', 'r1c3'],
['r2c1', 'r2,c2', 'r2c2']];

var result = array2.map((elem, i)=>[...(array1[i] || new Array(array1[0].length).fill('empty')), ...elem]);

console.log(result);


0 commentaires

0
votes

Je lis votre question comme étant non seulement de savoir comment créer un tableau fusionné, mais en fait de manipuler les données in situ, donc je l'aborderais comme ceci (en supposant que le tableau 1 vit sur la feuille 1 et le tableau 2 vit sur la feuille 2:

function translateArray(){
var sh = SpreadsheetApp.getActiveSpreadsheet();
var ss = sh.getSheetByName("Sheet1");
var os = sh.getSheetByName("Sheet2");
var range1 = ss.getRange("A1:C2");//2 rows 3 columns
var range1Width = range1.getValues()[0].length;//checks length of first row - the width
var range2 = os.getRange("A1:B3");//3 rows 2 columns
var data = range2.getValues();

ss.getRange(1,range1Width,data.length, data[0].length).setValues(data);

}

Ce code copie les données de la feuille 2 sur la feuille 1 à côté.

utilisez [1] au lieu de [0] dans range1Width si vous avez des données d'en-tête plus large que les données réelles.


0 commentaires

0
votes

Une approche moins orthodoxe:

function merge2Arrays() {
  var array1 = [['r1c1', 'r1c2', 'r1c3'],['r2c1', 'r2,c2', 'r2c3']];
  var array2 = [['r1c4', 'r1c5'],['r2c4', 'r2c5'],['r3c4', 'r3c5']];
  const ss=SpreadsheetApp.getActive();
  const sh=ss.insertSheet('xxxxx');
  sh.getRange(1,1,array1.length,array1[0].length).setValues(array1);
  sh.getRange(1,array1[0].length+1,array2.length,array2[0].length).setValues(array2);
  const a=sh.getDataRange().getValues();
  ss.deleteSheet(sh);
  ret a;
}

function merge3Arrays() {
  var array1 = [['r1c1', 'r1c2', 'r1c3'],['r2c1', 'r2,c2', 'r2c3']];
  var array2 = [['r1c4', 'r1c5'],['r2c4', 'r2c5'],['r3c4', 'r3c5']];
  var array3 = [["r1C6"],["r2c6"],["r3c6"],["r4c6"],["r5c6"],["r6c6"]];
  const ss=SpreadsheetApp.getActive();
  const sh=ss.insertSheet('xxxxx');
  sh.getRange(1,1,array1.length,array1[0].length).setValues(array1);
  sh.getRange(1,array1[0].length+1,array2.length,array2[0].length).setValues(array2);
  sh.getRange(1,array1[0].length + array2[0].length + 1,array3.length,array3[0].length).setValues(array3);
  const a=sh.getDataRange().getValues();
  ss.deleteSheet(sh);
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(JSON.stringify(a)), "Display Array");
}


0 commentaires