应用程序脚本谷歌doc副本表与内嵌图像

时间:2016-05-13 09:36:07

标签: google-apps-script google-docs-api

我正在尝试将GDoc的内容复制到另一个GDoc中。这适用于所有不同的元素类型。包括一个表(Enum DocumentApp.ElementType.TABLE)。但是,如果表包含内嵌图像(Enum DocumentApp.ElementType.INLINE_IMAGE),则不会正确复制图像。

这是源GDoc示例的链接。 https://docs.google.com/document/d/14kXjC0CTkEgmD7Ttv0YKL9ubfDRHbL1hCVOqOiyiEDU/edit#。使用新西兰国旗查找表格中的行。该标志未正确复制到目标GDoc的新表中。

我只是在源文档中找到表对象(上图)并使用Body :: insertTable(childIndex,table)将其插入到目标GDoc的Body中。表中的大多数其他元素都可以复制。包括嵌入式Google绘图。但不是内嵌图像。

3 个答案:

答案 0 :(得分:0)

可以在Class InlineImage中找到可用于复制内嵌图像的方法,如果内嵌图像包含在ListItemParagraph中,则甚至还有其他方法。

答案 1 :(得分:0)

我有类似的问题,在我的情况下,编号列表的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();
      }
    }
  }
}

当然,这可以很好地调整。 如果您希望服务器必须减少工作量,您可以搜索并选择内嵌图像。

我希望,这有助于任何方式。 非常感谢你的关注,

理查德

答案 2 :(得分:0)

我找到了这个bug的无编码解决方案。

将图像插入&#34;绘图&#34;在源文档中。

  1. 单击需要插入图像的表格单元格。
  2. 点击&#34;插入&#34;在文档的菜单上。
  3. 点击&#34;插入图纸&#34;。
  4. 在绘图窗格中添加要插入的图像。
  5. 保存并关闭。
  6. 结果将是表格中的图像,它与TABLE类型一起被完美复制。