我正试图将GDoc的内容复制到另一个GDoc中。这适用于所有不同的元素类型。包括一个表(枚举DocumentApp.ElementType.TABLE
)。但是,如果表包含内联映像(枚举DocumentApp.ElementType.INLINE_IMAGE
),则该映像不会正确复制。
这里有一个指向源GDoc示例的链接。https://docs.google.com/document/d/14kXjC0CTkEgmD7Ttv0YKL9ubfDRHbL1hCVOqOiyiEDU/edit#.在表中查找带有新西兰国旗的行。该标志未正确复制到目标GDoc的新表中。
我只是在源文档(如上)中找到表对象,并使用Body::insertTable(childIndex,table)
将其插入到目标GDoc的Body中。表中的大多数其他元素都可以复制。包括嵌入的谷歌绘图。但不是内联图像。
我也遇到了类似的问题,在我的案例中,编号列表的GLYPH_TYPE
也丢失了。但我检测到,如果逐个复制CellChildren,图像将被精细复制。
因此,我解决了我的问题,将新表整体复制,然后从原始表中逐个替换每个dstTable
单元格的内容。
现在,即使使用嵌套表,这也能很好地工作,因为如果检测到表中的另一个表,函数会调用自己。通过在插入后额外设置属性,丢失ListItem属性的问题也得到了解决。
这是我工作良好的代码段:
首先,我检测该表并将其插入dstBody
。。。
...
dstChild = srcChild.copy();
switch( dstChild.getType() ) {
case DocumentApp.ElementType.PARAGRAPH:
...
case DocumentApp.ElementType.LIST_ITEM:
...
case DocumentApp.ElementType.TABLE:
var newTable =
dstBody.insertTable( dstBody.getNumChildren()-1, dstChild );
copyTableCellByCell( dstChild, newTable );
break;
....
}
这可能是一个递归函数,它通过首先清除每个单元格并复制原始表中的内容来替换每个单元格:
function copyTableCellByCell( srcTable, dstTable ) {
var numRows = dstTable.getNumRows();
var dstRow, numCells, dstCell, actCellIndex;
for ( var actRowIndex = 0; actRowIndex < numRows; actRowIndex++ ) {
dstRow = dstTable.getRow( actRowIndex );
numCells = dstRow.getNumCells();
for ( actCellIndex = 0; actCellIndex < numCells; actCellIndex++ ) {
dstCell = dstRow.getCell( actCellIndex );
dstCell.clear();
var srcCell = srcTable.getCell( actRowIndex, actCellIndex );
var numCellChildren = srcCell.getNumChildren();
for ( var y = 0; y < numCellChildren; y++ ) {
var cellChild = srcCell.getChild( y );
var childCopy = cellChild.copy();
switch( childCopy.getType() ) {
case DocumentApp.ElementType.PARAGRAPH:
dstCell.insertParagraph( y, childCopy );
break;
case DocumentApp.ElementType.LIST_ITEM:
// that the GLYPH_TYPE doesn't get lost
var atts = childCopy.getAttributes();
var
newListItem = dstCell.insertListItem( y, childCopy );
newListItem.setAttributes( atts );
break;
case DocumentApp.ElementType.TABLE:
var newTable =
dstCell.insertTable( y, childCopy );
copyTableCellByCell( cellChild, newTable );
break;
}
}
// remove the very first empty paragraph in the cell
while ( (y = dstCell.getNumChildren()) > numCellChildren ) {
dstCell.getChild( y - 1 ).removeFromParent();
}
}
}
}
当然,这可以进行微调。如果你想让服务器做更少的工作,你可以只搜索并挑选内联图像。
可以用来复制内联图像的方法可以在class InlineImage中找到,如果内联图像包含在ListItem或Paragraph中,甚至还有其他方法。
我发现了一个针对这个bug的无编码解决方案。
将图像作为"绘图"插入到源文档中。
- 单击需要插入图像的表格单元格
- 单击文档菜单上的"插入"
- 单击"插入图形"
- 在绘图窗格中添加要插入的图像
- 保存并关闭
结果将是表中的一个图像,该图像与table类型一起被完美复制。