Этот фрагмент кода скрипта Google Apps

    for (let el = 0; el < tempDocBody.getNumChildren(); el++) {
      const elem = tempDocBody.getChild(el);
      Logger.log(
        "ProcessMainTable [%s] %s %s",
        el,
        elem.getType().toString(),
        elem.asText().getText(),
      );
      switch (elem.getType()) {
        case DocumentApp.ElementType.TABLE:
          target.getBody().insertTable(offset++, elem.asTable().copy());
          break;
        case DocumentApp.ElementType.PARAGRAPH:
          target.getBody().insertParagraph(offset++, elem.asParagraph().copy());
          break;
      }
    }

Работает нормально, ЗА ИСКЛЮЧЕНИЕМ того, что изображение, встроенное в одну из ячеек ТАБЛИЦЫ, не копируется в цель. Все остальное проходит хорошо, например. шрифты и форматирование. Разве .copy() не должно быть "глубоким"?

Есть ли у кого-нибудь обходной путь?

1
bugmagnet 15 Июн 2020 в 11:29

1 ответ

Лучший ответ

Я верю вашей ситуации и цели следующим образом.

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

Для этого как насчет этой модификации? В этом случае кажется, что встроенные изображения нельзя напрямую скопировать с помощью copy(). Итак, как обходной путь после копирования таблицы из исходного документа в целевой документ, как насчет помещения изображений из исходного документа в целевой документ?

Когда ваш скрипт изменяется, он становится следующим.

Измененный скрипт:

target.getBody().insertTable(offset++, elem.asTable().copy());
var srcTable = elem.asTable().copy();
var dstTable = target.getBody().insertTable(offset++, srcTable);
for (var i = 0; i < srcTable.getNumRows(); i++) {
  for (var j = 0; j < srcTable.getRow(i).getNumCells(); j++) {
    var cell = srcTable.getCell(i, j);
    for (var k = 0; k < cell.getNumChildren(); k++) {
      var paragraph = cell.getChild(k).asParagraph();
      for (var l = 0; l < paragraph.getNumChildren(); l++) {
        var child = paragraph.getChild(l);
        if (child.getType() == DocumentApp.ElementType.INLINE_IMAGE) {
          var srcImg = child.asInlineImage();
          dstTable.getCell(i, j).getChild(k).asParagraph().clear().insertInlineImage(l, srcImg.getBlob()).setWidth(srcImg.getWidth()).setHeight(srcImg.getHeight());
        }
      }
    }
  }
}

Заметка:

  • Я искал об этой проблеме в системе отслеживания проблем Google. Но я не мог его найти. Так как насчет того, чтобы сообщить об этом в систему отслеживания проблем? Ссылка

Ссылки:

1
Tanaike 15 Июн 2020 в 09:10