3 votes

Créer une grille (n,n) avec les éléments de page sélectionnés

En utilisant l'application Google script, je génère une grille avec des éléments sélectionnés. Dans l'exemple ci-dessous, j'ai saisi les lignes 2 et les colonnes 3 pour générer l'ordre de la grille. Ma logique semble être la production de lignes et de colonnes erronées.

Enjeu Le nombre de lignes et de colonnes est erroné.

function grid() {
  var selection = SlidesApp.getActivePresentation().getSelection();
  var pageElements = selection.getPageElementRange().getPageElements();

  //init
  var numRows = 2;
  var horizontalSpace = 5;
  var numColumns = 3;
  var verticalSpace = 10;

  /*get Left, Top, width, height of ist shape.*/
  var shape0Left = pageElements[0].asShape().getLeft(),
    shape0Top = pageElements[0].asShape().getTop(),
    shape0Width = pageElements[0].asShape().getWidth(),
    shape0Height = pageElements[0].asShape().getHeight();

  /*Set the element properties*/
  var elemLeft = shape0Left,
    elemTop = shape0Top,
    elemWidth = 0,
    elemHeight = 0;

  /*Iterate the page selected elements*/
  pageElements.forEach(function(item, index) {
    pageElements[index]
      .asShape()
      .setLeft(elemLeft)
      .setTop(elemTop);

    /*Something wrong with the logic*/
    if ((index + 1) % numRows == 0) {
      /*update the properties of each shape to place in row column order */
      elemTop = shape0Top + pageElements[index].asShape().getHeight() + 10;
      elemLeft = shape0Left;
    } else {
      elemLeft = shape0Left + pageElements[index].asShape().getWidth() + 10;
    }
  });
}

Résultat à venir Résultat attendu :

4voto

dwmorrin Points 2364

Avec la stratégie que vous adoptez, vous devez mettre à jour le fichier elemTop y elemLeft à l'aide de la fonction += afin de s'assurer d'inclure l'ancienne valeur le cas échéant.

De plus, vous avez mis en place ces belles verticalSpace y horizontalSpace Utilisez les constantes !

Si vous devez sortir rapidement de la boucle d'éléments parce que vous ne voulez manipuler que les 6 premiers éléments, vous ne pouvez pas utiliser la fonction forEach sur l'ensemble du tableau (du moins pas sans un if (index >= 6) return; garde). Vous pouvez simplement faire une boucle avec un for et tester que i < rumRows * numColumns ou vous pouvez obtenir uniquement le premier n avec des éléments pageElements.slice(0, n) et utiliser forEach sur que de la gamme.

Enfin, de la manière dont vous avez configuré le système, nous devons vérifier si nous sommes à la dernière colonne ou non. Pour vérifier le numéro de la colonne actuelle (indexée à zéro), vous pouvez utiliser var col = i % numColumns .

Avec un for boucle :

  /*Iterate the page selected elements*/
  for (var i = 0; i < numRows * numColumns; ++i) {       
    pageElements[i].asShape().setLeft(elemLeft).setTop(elemTop);
    var col = i % numColumns;
    if ((col+1) % numColumns == 0) {         
      elemTop += pageElements[i].asShape().getHeight() + verticalSpace;
      elemLeft = shape0Left;   
    } else {
      elemLeft += pageElements[i].asShape().getWidth() + horizontalSpace;
    }
  }

Utilisation slice y forEach :

  pageElements.slice(0, numRows * numColumns).forEach(function(item, index){
    item.asShape().setLeft(elemLeft).setTop(elemTop);
    var col = index % numColumns;
    if ((col+1) % numColumns == 0) {         
      elemTop += item.asShape().getHeight() + verticalSpace;
      elemLeft = shape0Left;   
    } else {
      elemLeft += item.asShape().getWidth() + horizontalSpace;
    }
  });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X