google-apps-script - 使用选定的页面元素创建网格 (n,n)
问题描述
使用 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;
}
});
}
即将到来的结果 预期输出:
解决方案
使用您所采取的策略,您应该使用运算符更新elemTop
和elemLeft
变量+=
,以确保在适当的位置包含旧值。
此外,您已经设置了这些 niceverticalSpace
和horizontalSpace
常量;使用它们!
如果因为只想操作前 6 个元素而需要尽早跳出元素循环,则不能forEach
在整个数组上使用(至少在没有if (index >= 6) return;
保护的情况下不能使用)。您可以使用常规for
循环循环并测试它i < rumRows * numColumns
,或者您可以只获取前n 个元素pageElements.slice(0, 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;
}
}
使用slice
和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;
}
});
推荐阅读
- php - 在 wordpress 中使用片段 php,但我的 php 不起作用。为什么?
- node.js - 这个带有验证器的猫鼬模式是否正确?
- flutter - 如何将数据从 showmodalbottomsheet 传递到 Flutter 中的上一页
- javascript - 将秒转换为天和小时
- javascript - 如何重置设置间隔功能的间隔
- flutter - 如何根据 Flutter 中的 DropdownMenuItem 选择值显示 REST API 数据?
- html - 将表格标题中的文本旋转 90 或 270 度后对齐
- c# - 为什么有些输入会通过 while 循环?
- typescript - 如何在 TypeScript 中将类型化记录声明为返回记录的函数的返回值?
- reactjs - TypeError:无法读取 null 的属性(读取“1”)