形状大小不等于 table 单元格大小并且适合形状内的文本
Shape size not equal to the table cell size and fit the text inside the shape
正在尝试插入等于 table 单元格大小的形状。
我使用 InsertShape()
创建了形状,并将行高(可能是单元格的高度)、列宽(可能是单元格的宽度)复制到形状中。
问题:
- 形状的大小不等于单元格的高度和宽度大小。
- 形状内的文字变形,形状的文字应该自动适应,而单元格的文字适合单元格。
我不能说 .getRow().getMinimumHeight()
是如何工作的。
文本长度不固定。它可以像一个长段落。
Google Apps 脚本的限制:
Table 单元格 - Google Apps 脚本无法获取每个单元格的宽度和高度
Google 应用程序脚本:
let activePresentation = SlidesApp.getActivePresentation()
let selection = activePresentation.getSelection()
let pageElements = selection.getPageElementRange().getPageElements()
//get table Left, table Top of each table under the pageElement object
var tableLeft = pageElements[0].asTable().getLeft(),
tableTop = pageElements[0].asTable().getTop();
var cellTop = tableTop; //cell top possible equal to table top
var cellLeft = tableLeft; //cell top possible equal to table Left
//get the row height and column width
var rowHeight = pageElements[0].asTable().getRow(0).getMinimumHeight();
var columnWidth = pageElements[0].asTable().getColumn(0).getWidth();
//get the internal text of cell
var cellText = pageElements[0].asTable().getCell(0, 0).getText().asString()
//insert shape equal to the table cell size
var shape_t = selection.getCurrentPage()
.insertShape(SlidesApp.ShapeType.RECTANGLE,
cellLeft+200,
cellTop,
columnWidth,
rowHeight);
//set the cell text insde the Shape
shape_t.getText().setText(cellText);
在这里你可以看到演示https://docs.google.com/presentation/d/10nupvk-2BZDSV6-gPn_n2LkrUtkCxot7qr_jcZGBHqw/edit?usp=sharing
完整脚本:
https://pastebin.com/CrV3qHwG
复制问题
将上面提到的 https://pastebin.com/CrV3qHwG 脚本粘贴到 Google 脚本编辑器中,
添加一个 1 行 1 列的 table,显然它只有一个单元格。
Select table 然后 运行 通过点击“Test So”菜单中的“Create Shape”脚本。
图像显示问题和快速查看的预期结果
根据你补充的信息,我可以确认你的情况。当我看到它时,我可以注意到 table 有一个单元格,并且 table 大小是默认大小。在本例中,table 使用单元格的默认行高。并且单元格的高度由输入的文本自动设置。这样,行高只有一行,即381000 EMU(30像素)的高度。关于这种情况,我确认从 Slides 服务和 Slides API 都获得了相同的结果。所以这似乎是当前的规格。
当你想要获取实际高度时,在现阶段,我认为需要通过手动或脚本设置高度并获取高度。这样,table就是实际的行高。
或者,虽然这与包括文本在内的默认table的行高并不完全相同,但我认为行高也可以使用换行符和字体大小来计算。在这个答案中,我通过修改您的脚本来介绍示例脚本。
示例修改:
为了给个高度,作为修改示例,我想提出如下脚本。当你的脚本修改后,变成如下。
从:
var rowHeight = pageElements[0].asTable().getRow(0).getMinimumHeight();
到:
var t = pageElements[0].asTable().getRow(0).getCell(0).getText();
var rowHeight = (t.asString().split("\n").length - 1) * (t.getTextStyle().getFontSize() / 72 * 96);
- 在此修改中,行高是使用换行符和字体大小计算的。
t.asString().split("\n").length - 1
是换行的个数。
t.getTextStyle().getFontSize() / 72 * 96
是字体大小的像素值。似乎在 Google 幻灯片中使用了 96 DPI。
- 但是,不幸的是,在当前阶段,结果与默认的 table 行高并不完全相同。
- 在这种情况下,当
rowHeight
乘以1.08
时,得到相同的高度。但这个因素是没有根据的。请注意这一点。
正在尝试插入等于 table 单元格大小的形状。
我使用 InsertShape()
创建了形状,并将行高(可能是单元格的高度)、列宽(可能是单元格的宽度)复制到形状中。
问题:
- 形状的大小不等于单元格的高度和宽度大小。
- 形状内的文字变形,形状的文字应该自动适应,而单元格的文字适合单元格。
我不能说 .getRow().getMinimumHeight()
是如何工作的。
文本长度不固定。它可以像一个长段落。
Google Apps 脚本的限制:
Table 单元格 - Google Apps 脚本无法获取每个单元格的宽度和高度
Google 应用程序脚本:
let activePresentation = SlidesApp.getActivePresentation()
let selection = activePresentation.getSelection()
let pageElements = selection.getPageElementRange().getPageElements()
//get table Left, table Top of each table under the pageElement object
var tableLeft = pageElements[0].asTable().getLeft(),
tableTop = pageElements[0].asTable().getTop();
var cellTop = tableTop; //cell top possible equal to table top
var cellLeft = tableLeft; //cell top possible equal to table Left
//get the row height and column width
var rowHeight = pageElements[0].asTable().getRow(0).getMinimumHeight();
var columnWidth = pageElements[0].asTable().getColumn(0).getWidth();
//get the internal text of cell
var cellText = pageElements[0].asTable().getCell(0, 0).getText().asString()
//insert shape equal to the table cell size
var shape_t = selection.getCurrentPage()
.insertShape(SlidesApp.ShapeType.RECTANGLE,
cellLeft+200,
cellTop,
columnWidth,
rowHeight);
//set the cell text insde the Shape
shape_t.getText().setText(cellText);
在这里你可以看到演示https://docs.google.com/presentation/d/10nupvk-2BZDSV6-gPn_n2LkrUtkCxot7qr_jcZGBHqw/edit?usp=sharing
完整脚本: https://pastebin.com/CrV3qHwG
复制问题 将上面提到的 https://pastebin.com/CrV3qHwG 脚本粘贴到 Google 脚本编辑器中, 添加一个 1 行 1 列的 table,显然它只有一个单元格。 Select table 然后 运行 通过点击“Test So”菜单中的“Create Shape”脚本。
图像显示问题和快速查看的预期结果
根据你补充的信息,我可以确认你的情况。当我看到它时,我可以注意到 table 有一个单元格,并且 table 大小是默认大小。在本例中,table 使用单元格的默认行高。并且单元格的高度由输入的文本自动设置。这样,行高只有一行,即381000 EMU(30像素)的高度。关于这种情况,我确认从 Slides 服务和 Slides API 都获得了相同的结果。所以这似乎是当前的规格。
当你想要获取实际高度时,在现阶段,我认为需要通过手动或脚本设置高度并获取高度。这样,table就是实际的行高。
或者,虽然这与包括文本在内的默认table的行高并不完全相同,但我认为行高也可以使用换行符和字体大小来计算。在这个答案中,我通过修改您的脚本来介绍示例脚本。
示例修改:
为了给个高度,作为修改示例,我想提出如下脚本。当你的脚本修改后,变成如下。
从:var rowHeight = pageElements[0].asTable().getRow(0).getMinimumHeight();
到:
var t = pageElements[0].asTable().getRow(0).getCell(0).getText();
var rowHeight = (t.asString().split("\n").length - 1) * (t.getTextStyle().getFontSize() / 72 * 96);
- 在此修改中,行高是使用换行符和字体大小计算的。
t.asString().split("\n").length - 1
是换行的个数。t.getTextStyle().getFontSize() / 72 * 96
是字体大小的像素值。似乎在 Google 幻灯片中使用了 96 DPI。- 但是,不幸的是,在当前阶段,结果与默认的 table 行高并不完全相同。
- 在这种情况下,当
rowHeight
乘以1.08
时,得到相同的高度。但这个因素是没有根据的。请注意这一点。