单元格内的文本时如何获得 Table 单元格的正确高度

How to get the correct height of Table cell when text inside the cell

历史: -

解决方案运行完美,但是当我们更改任何文本的文本高度时我发现了一些问题,就像我对“Text 1”所做的那样,我更改了“ Text 1", 那么行高的结果就是0.0

Google Apps 脚本的限制: 取不到cell的高度,取不到cell的padding。

经过一些研究尝试将单元格的段落提取为文本。

使用我的和 Tanaike 修改更新了脚本:

var rowHeight = 0.0;

  var tableCell = pageElements[index].asTable().getCell(ir, ic);

  //Get cell color
  let cellFill = tableCell.getFill().getSolidFill();

  var cellParaText = tableCell.getText().getParagraphs();
  cellParaText.forEach(function(item, index) {
    
    var t = cellParaText[index].getRange();

    //I tried to applied Tanaike's solution here

    rowHeight = rowHeight + ( t.asString().split("\n").length - 1 ) * ( t.getTextStyle().getFontSize() / 72 * 96 )

    //rowHeight = rowHeight + cellParaText[index].getRange().getTextStyle().getFontSize();

    rowHeight = rowHeight + cellParaText[index].getRange().getParagraphStyle().getSpaceAbove()
    rowHeight = rowHeight + cellParaText[index].getRange().getParagraphStyle().getSpaceBelow()
    rowHeight = rowHeight + (cellParaText[index].getRange().getParagraphStyle().getLineSpacing()/100)

  });


  //Get cell text, text color and text background color
  let cellText = tableCell.getText().asString()

  //insert the RECTANGLE shape 
  let insertedShape = selection.getCurrentPage()
                        .insertShape(SlidesApp.ShapeType.RECTANGLE, cellLeft+5, cellTop+5, columnWidth, rowHeight);

完整脚本在这里https://pastebin.com/keXKHbhC

这是我在 GSlide 中的 Table - https://docs.google.com/presentation/d/10nupvk-2BZDSV6-gPn_n2LkrUtkCxot7qr_jcZGBHqw/edit#slide=id.p

问题仍然与形状高度等于 table 单元格相同,请参见图片

这个修改怎么样?

修改点:

  • 当我检查getSpaceAbove()getSpaceBelow()时,似乎那些是0
  • 我认为getLineSpacing()可能会被使用。
  • 而且,我注意到了更重要的一点。比如有3段的时候,好像要用4段的空格。

当这个点数反映到你的https://pastebin.com/keXKHbhC的脚本中,就变成了下面这样

修改后的脚本:

发件人:

cellParaText.forEach(function(item, index) {

  var t = cellParaText[index].getRange();
  
  //i tried to applied Tanike's solution here
  rowHeight = rowHeight + ( t.asString().split("\n").length - 1 ) * ( t.getTextStyle().getFontSize() / 72 * 96 )
  
  //rowHeight = rowHeight + cellParaText[index].getRange().getTextStyle().getFontSize();
  
  rowHeight = rowHeight + cellParaText[index].getRange().getParagraphStyle().getSpaceAbove()
  rowHeight = rowHeight + cellParaText[index].getRange().getParagraphStyle().getSpaceBelow()
  rowHeight = rowHeight + (cellParaText[index].getRange().getParagraphStyle().getLineSpacing()/100)

});

收件人:

cellParaText.forEach(function(item, index, a) {
  var t = cellParaText[index].getRange();
  var lineSpace = cellParaText[index].getRange().getParagraphStyle().getLineSpacing() / 100;
  var fontSize = t.getTextStyle().getFontSize() / 72 * 96;
  rowHeight += fontSize * (a.length > 1 ? lineSpace : 1);
  if (index == a.length - 1) rowHeight += fontSize;
});

另外,请修改如下。

发件人:

insertedShape.getText()
            .getParagraphStyle()
            .setLineSpacing(cellParagraph.getLineSpacing()/100)
            .setSpaceAbove(cellParagraph.getSpaceAbove())
            .setSpaceBelow(cellParagraph.getSpaceBelow())
            .setSpacingMode(cellParagraph.getSpacingMode())
            .setParagraphAlignment(cellParagraph.getParagraphAlignment())

收件人:

insertedShape.getText()
            .getParagraphStyle()
            .setParagraphAlignment(cellParagraph.getParagraphAlignment())

结果:

当你的示例 Google Slides 与上面修改后的脚本一起使用时,它变成如下。

注:

  • 这是您的示例的简单示例脚本。因此,当您使用其他示例时,可能需要修改脚本。请注意这一点。
  • 在这种情况下,根据您的示例,它假定每个段落的字体大小相同。请注意这一点。