google-apps-script - 使用选定的页面元素创建网格 (n,n)

标签 google-apps-script sidebar add-on google-slides

使用 Google 应用程序脚本,我正在生成一个包含选定元素的网格。 在下面的这个例子中——我给了输入行 2 和列 3 来生成网格的顺序。 我的逻辑似乎是产生了错误的行和列。

问题:行数和列数错误。

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;
    }
  });
}

结果 预期输出:

最佳答案

根据您正在采取的策略,您应该更新 elemTopelemLeft使用 += 的变量运算符确保在适当的地方包含旧值。

此外,您设置了这些漂亮的 verticalSpacehorizontalSpace常数;使用它们!

如果因为只想操作前 6 个元素而需要提前跳出元素循环,则不能使用 forEach在整个阵列上(至少在没有 if (index >= 6) return; 守卫的情况下)。您可以使用常规 for 进行循环循环并测试 i < rumRows * numColumns ,或者您可以使用 pageElements.slice(0, n) 获取前 n 个元素并使用 forEach那个数组上。

最后,根据您设置的方式,我们需要检查我们是否在最后一列。要检查当前列号(零索引),您可以使用 var col = i % numColumns .

for循环:

  /*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;
    }
  }

使用 sliceforEach :

  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;
    }
  });

关于google-apps-script - 使用选定的页面元素创建网格 (n,n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63317505/

相关文章:

css - 为什么溢出:hidden is working only in chrome and not in firefox

c++ - ToCString 的 header 在哪里,或者如何将参数转换为 cstrings?

Java IE - 用于 Java 的 Internet Explorer

c# - C# 中的 Skype 插件

javascript - 如何将电子表格中的所有数据捕获到谷歌表单

javascript - Html服务 : Passing array from google sheet to html service and passing form array back error

带有三个选择器 : role v. 类的 Html 5 + css3 两个侧边栏?

iphone - ZUUIRevealController - 通过按后 Controller 中的表格 View 单元格将 View 推送到前 View 上

google-apps-script - 调用YOUTUBE视频API时无法获得视频时长

javascript - 如何使用 Google App Script 从电子邮件中提取内联文件/图像?