Как получить правильную высоту ячейки таблицы, когда текст внутри ячейки

Aug 17 2020

История: - Размер фигуры не равен размеру ячейки таблицы и помещается под текст внутри фигуры

Решение работало отлично, но я обнаружил некоторые проблемы, когда мы изменили высоту текста любого текста. Как я сделал с « Текст 1 », я изменил высоту « Текст 1 », тогда результат высоты строки будет 0,0

Ограничение скрипта Google Apps: мы не можем получить высоту ячейки, не можем получить заполнение ячейки.

После некоторых исследований попытался извлечь абзац из ячейки как текст.

Обновленный скрипт с модификацией my и 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 - https://docs.google.com/presentation/d/10nupvk-2BZDSV6-gPn_n2LkrUtkCxot7qr_jcZGBHqw/edit#slide=id.p

По-прежнему проблема такая же, когда высота формы равна ячейке таблицы, см. Изображение

Ответы

1 Tanaike Aug 17 2020 at 23:57

Как насчет этой модификации?

Пункты модификации:

  • Когда я проверил 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 используется с измененным выше скриптом, он выглядит следующим образом.

Заметка:

  • Это простой пример сценария для вашего образца. Поэтому, когда вы используете другой образец, сценарий может потребоваться изменить. Пожалуйста, будьте осторожны.
  • В этом случае из вашего образца предполагается, что каждый абзац имеет одинаковый размер шрифта. Пожалуйста, будьте осторожны.