【问题标题】:Shape size not equal to the table cell size and fit the text inside the shape形状大小不等于表格单元格大小并且适合形状内的文本
【发布时间】:2020-08-15 16:49:15
【问题描述】:

尝试插入与表格单元格大小相等的形状。

我使用InsertShape() 创建了形状,并将行高(可能是单元格的高度)、列宽(可能是单元格的宽度)复制到了形状中。

问题:

  1. 形状大小不等于单元格大小的高度和宽度。
  2. 形状内的文本变形,形状文本应自动适应,而单元格文本适合单元格内。

我不能说.getRow().getMinimumHeight() 是如何工作的。

文本长度不固定。它可能像一个很长的段落。

Google Apps 脚本的限制:

表格单元格 - Google Apps 脚本无法获取每个单元格的宽度和高度

Google Apps 脚本:

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

复制问题 在 Google 脚本编辑器中粘贴上面提到的 https://pastebin.com/CrV3qHwG 脚本, 添加一个 1 行 1 列的表格,显然它将只有一个单元格。 选择表,然后通过单击“Test So”菜单中的“Create Shape”运行脚本。

图像在快速视图中显示问题和预期结果

【问题讨论】:

  • 很遗憾,我无法复制您的情况。那么我可以问你关于复制你的问题的详细流程吗?
  • @Tanaike 在这里您可以看到演示 docs.google.com/presentation/d/… 完整脚本:pastebin.com/CrV3qHwG 复制上述问题中添加的问题的步骤。
  • 感谢您回复并添加更多信息。我能理解你的情况。在您的情况下,似乎使用默认行高的行高。在这种情况下,高度可以由文本自动设置。这样,行高只有一行,即381000 EMU(30像素)的高度。所以当你想检索实际高度时,在现阶段,我认为需要手动或脚本设置高度并检索高度。
  • @Tanaike OP 要求您添加 answer。
  • @TheMaster 感谢您的支持。我能理解。我想准备一下。

标签: javascript google-apps-script shapes google-slides


【解决方案1】:

根据您的补充信息,我可以确认您的情况。当我看到它时,我注意到表格只有一个单元格,表格大小是默认大小。在这种情况下,表格使用单元格的默认行高。并且单元格的高度由输入的文本自动设置。这样,行高只有一行,即381000 EMU(30像素)的高度。关于这种情况,我确认从 Slides 服务和 Slides API 获得了相同的结果。所以看起来这是当前的规范。

当你想获取实际高度时,在当前阶段,我认为需要手动或脚本设置高度并获取高度。这样,表格就是实际的行高。

或者,虽然这与包含文本的默认表格的行高不完全相同,但我认为行高也可以使用换行符和字体大小来计算。在这个答案中,我通过修改你的脚本来介绍这个示例脚本。

样例修改:

为了给出高度,作为示例修改,我想提出以下脚本。当你的脚本被修改后,变成如下。

从:
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。
    • 但很遗憾,在当前阶段,结果与默认表格行高并不完全相同。
    • 在这种情况下,当rowHeight乘以1.08时,得到相同的高度。但这个因素是没有根据的。请注意这一点。

【讨论】:

  • @Tanike ,还有更多的障碍。我们应该在聊天中讨论吗?
  • Tanike 您的解决方案运行良好,但是当我们更改任何文本的文本高度时我发现了一些问题 就像我对“文本 1”所做的那样,我更改了“文本 1”的高度,然后行高的结果将是 0.0,
  • @Puzzled Boy 感谢您的回复。我不得不为我糟糕的英语水平道歉。我的附加提案脚本是用于解释方法的脚本。所以我的示例脚本是一个简单的示例脚本,用于使用您共享的幻灯片来解释上述情况。所以我认为当你想在各种情况下使用它时,需要对其进行修改。非常抱歉我的示例脚本不能用于您的各种情况。
  • @Puzzled Boy 如果要在单元格中使用各种字体大小,请检索每个字体大小并检索每行的最大字体大小并计算行高。我认为你的新情况问题的原因是这个。而且,在您的脚本中,文本数据从单元格复制到形状。所以在这种情况下,每个字体大小都需要复制。我认为这与您最初的问题和答案的方向不同。所以我只提出了流程。如果这不是您期望的方向,我很抱歉。
  • @Puzzled Boy 顺便说一句,我认为您的新情况可能对其他用户有用。如果您需要示例脚本,如何通过包含您想要使用的情况的更多信息将其作为新问题发布?当然,这可以由您自行决定。这样,它将帮助用户思考解决方案。而且,我认为这样的问题和答案会对其他用户有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
相关资源
最近更新 更多