Как скопировать изображение из одной ячейки таблицы в другую в документах Google с помощью сценария Google (программно)? - PullRequest
0 голосов
/ 20 декабря 2018

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

Мой код копирует текст и таблицы.Однако то, что содержится в ячейках таблицы, не копируется.

Я сделал упрощенную версию кода и единый документ, доступный здесь: https://docs.google.com/document/d/1hcQzBuMA6E15u8VtW2lWGL7XCcU3qVsDhn-5jiznQP4/edit?usp=sharing.

Код просто копирует и вставляет содержимоедокумент Google, который включает в себя таблицу, содержащую таблицу / изображения.Та же проблема возникает.Содержимое ячейки не копируется. см. Скриншот

Вот упрощенная версия кода:

function test() {
  
  // Make Copy of template file
  doc = DocumentApp.getActiveDocument();
  body =doc.getBody();
  

  
  /// Copy elements from source file to target file one bich one
  var totalElements = body.getNumChildren();
  var types = new Array;
  
  for( var iel = 0; iel < totalElements; iel++ ) {
     current_body = doc.getBody();
    var element = body.getChild(iel).copy();
    var type = element.getType();
    types.push(type);
    
    switch(type){
      case DocumentApp.ElementType.PARAGRAPH:
        body.appendParagraph(element);
        break;
      case DocumentApp.ElementType.TABLE:
        var newTable =body.insertTable( body.getNumChildren()-1, element );
        CopyTableCellByCell( element, newTable );
        break;
      case DocumentApp.ElementType.LIST_ITEM:
        body.appendListItem(element);
        break;
      case DocumentApp.ElementType.INLINE_IMAGE:
        body.appendImage(element); 
        break;
        
    }
  }
  doc.saveAndClose();
}

// recursive function that replaces each cell by first clearing it and Copying the content from the original table
function CopyTableCellByCell( srcTable, dstTable ) {
  var numRows = srcTable.getNumRows();
  var srcRow, numCells, dstCell, icell;
  var types = new Array;
  
  for ( var irow = 0; irow < numRows; irow++ ) {// EACH ROW
    srcRow = srcTable.getRow( irow );
    dstRow = dstTable.getRow( irow );
    numCells = srcRow.getNumCells();
    
    for ( icell = 0; icell < numCells; icell++ ) { // EACH CELL
      dstCell = dstRow.getCell( icell );
      dstCell.clear();
      var srcCell = srcTable.getCell( irow, icell );
      var numCellChildren = srcCell.getNumChildren(); // ==> outputs 1 paragraph child instead of a paragraph and a table.
      
      
      for ( var ich = 0; ich < numCellChildren; ich++ ) { // EACH CHILD
        var cellChild = srcCell.getChild( ich );
        var childCopy = cellChild.copy();
        var type = childCopy.getType();
        types.push(type);


        switch( type ){
            
          case DocumentApp.ElementType.PARAGRAPH:
            dstCell.insertParagraph( ich, childCopy );
            break;
            
          case DocumentApp.ElementType.LIST_ITEM:
            var atts    = childCopy.getAttributes();
            var newListItem = dstCell.insertListItem( ich, childCopy );
            newListItem.setAttributes( atts );
            break;
            
          case DocumentApp.ElementType.TABLE:

            var newTable = dstCell.insertTable( ich, childCopy );
            CopyTableCellByCell( cellChild, newTable );
            break;
            
          case DocumentApp.ElementType.INLINE_IMAGE:
            var parpar = childCopy.getParent();
            var ttt = parpar.getType();
            destImg = parpar.insertInlineImage(l, childCopy.getBlob()); 
            dstImg.setWidth(childCopy.getWidth());
            dstImg.setHeight(childCopy.getHeight());
            break;

        }
        
      }

    }
  }
}

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Код почти функционирует.Последняя проблема заключается в том, что текст, соответствующий изображениям, не копируется.

Теперь я реструктурировал код с помощью дополнительных функций.copyContent () вызывает copyTable (), вызывает copyCellChild ()

copyCellChild (), функция, которая копирует дочерние ячейки из исходной ячейки в целевую ячейку, вызывает ошибки.

copyCellChild () игнорирует текст в соответствии с изображениями.

function copyContent() {
  
  // Make Copy of template file
  doc = DocumentApp.getActiveDocument();
  body =doc.getBody();
  
  
  /// Copy elements from source file to target file one bich one
  var totalElements = body.getNumChildren();
  var types = new Array;
  
  for( var iel = 0; iel < totalElements; iel++ ) {
    current_body = doc.getBody();
    var element = body.getChild(iel).copy();
    var type = element.getType();
    types.push(type);
    
    switch(type){
      case DocumentApp.ElementType.PARAGRAPH:
        body.appendParagraph(element);
        break;
      case DocumentApp.ElementType.TABLE:
        //var newTable =body.insertTable( body.getNumChildren()-1, element );
        //CopyTableCellByCell( element, newTable );
        var dstTable = body.appendTable(element);
        var srcTable = element.asTable();
        copyTable(srcTable, dstTable);
        break;
      case DocumentApp.ElementType.LIST_ITEM:
        body.appendListItem(element);
        break;
      case DocumentApp.ElementType.INLINE_IMAGE:
        body.appendImage(element); 
        break;
        
    }
  }
  doc.saveAndClose();
}

function copyTable(srcTable, dstTable) {
  
  var row = srcTable.getNumRows();
  
  for (var i = 0; i < row; i++) { // ROW
    var col = srcTable.getRow(i).getNumCells();
    
    for (var j = 0; j < col; j++) { // CELL
      
      var srcCell = srcTable.getCell(i, j);
      var c1 = srcCell.getNumChildren();
      var destCell = dstTable.getCell(i, j);
      
      for (var k = 0; k < c1; k++) { // CHILD
        copyCellChild(srcCell,destCell,k);        
      }
    }
  }
}


function copyCellChild(srcCell,destCell,k){
  
  var srcChild = srcCell.getChild(k);
  var destChild = destCell.getChild(k);
  var ty = srcChild.getType();
  
  switch(ty){
      
    case DocumentApp.ElementType.TABLE:
      srcTable = srcChild.asTable();
      dstTable = destChild.asTable();
      return copyTable(srcTable, dstTable);
      break;
      
    case DocumentApp.ElementType.INLINE_IMAGE:
      var srcImg = srcChild.asInlineImage();
      var dstParagraph = destChild.asParagraph();
      
      
      var dstImg = dstParagraph.insertInlineImage(l, srcImg.getBlob());
      dstImg.setWidth(srcImg.getWidth());
      dstImg.setHeight(srcImg.getHeight());
      break;
      
    case DocumentApp.ElementType.PARAGRAPH:
      var paragraph = srcChild.asParagraph();//
      var c2 = paragraph.getNumChildren();
      
      
      for (var l = 0; l < c2; l++) { // PARAGRAPH CHILDREN

        try{
          var srcParaChild = paragraph.getChild(l);
          var t = srcParaChild.getType();
          
          switch(t){
              
            case DocumentApp.ElementType.INLINE_IMAGE:
              
              var srcImg = srcParaChild.asInlineImage();
              var dstParagraph = destChild.asParagraph().clear();
              //var dstParagraph = destChild.asInlineImage().clear();//clear
              
              var dstImg = dstParagraph.insertInlineImage(l, srcImg.getBlob());
              dstImg.setWidth(srcImg.getWidth());
              dstImg.setHeight(srcImg.getHeight());
              dstImg.setLinkUrl(srcImg.getLinkUrl);
              break;
            case DocumentApp.ElementType.TEXT:
              //var srcTxt = srcChild.getText();
              //Logger.log(srcTxt);
              //var iii = 1;
              //destChild.asText().appendText(srcTxt);
              
          }
        }catch(e){// text in line with images
          var srcTxt = srcChild.getText();
          Logger.log(srcTxt);
          var iii = 1;
          destChild.asText().appendText(srcTxt);
          
        }
      }
  }
  
}

Вот пример документа Google, в котором вы можете запустить функцию: https://docs.google.com/document/d/1hcQzBuMA6E15u8VtW2lWGL7XCcU3qVsDhn-5jiznQP4/edit#

0 голосов
/ 21 декабря 2018

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

Точки модификации:

  • В случае копирования таблицы, когда есть ячейки, включая изображения, она копирует изображения изисходная таблица к целевой таблице.По этому изображение можно увидеть.Поток заключается в следующем.
    1. Скопируйте исходную таблицу в целевое устройство.
    2. Извлечение абзацев в ячейке.
    3. Извлечение изображения.
    4. Удаление изображения из целевой ячейки.
    5. Скопируйте изображение из исходной ячейки в целевую ячейку.

Модифицированный скрипт:

Пожалуйста, измените следующим образом.

От:
else if( type == DocumentApp.ElementType.TABLE){
  body.appendTable(element);
}
Кому:
else if( type == DocumentApp.ElementType.TABLE){
  var dstTable = body.appendTable(element);
  var srcTable = element.asTable();
  var row = srcTable.getNumRows();
  for (var i = 0; i < row; i++) {
    var col = srcTable.getRow(i).getNumCells();
    for (var j = 0; j < col; j++) {
      var cell = srcTable.getCell(i, j);
      var c1 = cell.getNumChildren();
      for (var k = 0; k < c1; k++) {
        var paragraph = cell.getChild(k).asParagraph();
        var c2 = paragraph.getNumChildren();
        for (var l = 0; l < c2; l++) {
          var child = paragraph.getChild(l);
          var t = child.getType();
          if (t === DocumentApp.ElementType.INLINE_IMAGE) {
            var srcImg = child.asInlineImage();
            var dstParagraph = dstTable.getCell(i, j).getChild(k).asParagraph().clear();
            var dstImg = dstParagraph.insertInlineImage(l, srcImg.getBlob());
            dstImg.setWidth(srcImg.getWidth());
            dstImg.setHeight(srcImg.getHeight());
          }
        }
      }
    }
  }
}

Ссылки:

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

Редактировать 1:

Для добавленной ситуации, пожалуйста, измените ваш сценарий следующим образом.

От:

else if( type == DocumentApp.ElementType.TABLE){
  body.appendTable(element);
}

Кому:

else if( type == DocumentApp.ElementType.TABLE){
  var dstTable = body.appendTable(element);
  var srcTable = element.asTable();
  copyTable(srcTable, dstTable);
}

И, пожалуйста, добавьте следующую функцию.

function copyTable(srcTable, dstTable) {
  var row = srcTable.getNumRows();
  for (var i = 0; i < row; i++) {
    var col = srcTable.getRow(i).getNumCells();
    for (var j = 0; j < col; j++) {
      var cell = srcTable.getCell(i, j);
      var c1 = cell.getNumChildren();
      for (var k = 0; k < c1; k++) {
        var ty = cell.getChild(k).getType();
        if (ty === DocumentApp.ElementType.TABLE) {
          srcTable = cell.getChild(k).asTable();
          dstTable = dstTable.getCell(i, j).getChild(k).asTable();
          return copyTable(srcTable, dstTable);
        } else {
          var paragraph = cell.getChild(k).asParagraph();
          var c2 = paragraph.getNumChildren();
          for (var l = 0; l < c2; l++) {
            var child = paragraph.getChild(l);
            var t = child.getType();
            if (t === DocumentApp.ElementType.INLINE_IMAGE) {
              var srcImg = child.asInlineImage();
              var dstParagraph = dstTable.getCell(i, j).getChild(k).asParagraph().clear();
              var dstImg = dstParagraph.insertInlineImage(l, srcImg.getBlob());
              dstImg.setWidth(srcImg.getWidth());
              dstImg.setHeight(srcImg.getHeight());
            }
          }
        }
      }
    }
  }
}

Редактировать 2:

Для добавленной ситуации, пожалуйста, измените ваш скрипт следующим образомминимумы.

От:

else if( type == DocumentApp.ElementType.TABLE){
  body.appendTable(element);
}

До:

else if( type == DocumentApp.ElementType.TABLE){
  var dstTable = body.appendTable(element);
  var srcTable = element.asTable();
  copyTable(srcTable, dstTable);
}

И, пожалуйста, добавьте следующую функцию.

function copyTable(srcTable, dstTable) {
  var row = srcTable.getNumRows();
  for (var i = 0; i < row; i++) {
    var col = srcTable.getRow(i).getNumCells();
    for (var j = 0; j < col; j++) {
      var cell = srcTable.getCell(i, j);
      var c1 = cell.getNumChildren();
      for (var k = 0; k < c1; k++) {
        var ty = cell.getChild(k).getType();
        if (ty === DocumentApp.ElementType.TABLE) {
          srcTable = cell.getChild(k).asTable();
          dstTable = dstTable.getCell(i, j).getChild(k).asTable();
          return copyTable(srcTable, dstTable);
        } else {
          var paragraph = cell.getChild(k).asParagraph();
          var c2 = paragraph.getNumChildren();
          for (var l = 0; l < c2; l++) {
            var child = paragraph.getChild(l);
            var t = child.getType();
            if (t === DocumentApp.ElementType.INLINE_IMAGE) {
              var srcImg = child.asInlineImage();
              var dstParagraph = dstTable.getCell(i, j).getChild(k).asParagraph();
              dstParagraph.getChild(l).asInlineImage().removeFromParent();
              var dstImg = dstParagraph.insertInlineImage(l, srcImg.getBlob());
              dstImg.setWidth(srcImg.getWidth());
              dstImg.setHeight(srcImg.getHeight());
            }
          }
        }
      }
    }
  }
}
...