1

我在一张空幻灯片中插入一个表格。然后我用不同的文本填充它。在此之后,我想获得桌子的高度。.getHeight 的结果为空。.getHeight 方法适用于形状和图像,但不适用于表格。我怎样才能得到桌子的高度?

function getTableHeight(){

     var presentation = SlidesApp.openById('myPresentationId');    
     var slides = presentation.getSlides();
     var slideId = 'mySlideId';
     var slide = slides.filter(function(e){return e.getObjectId() == slideId})[0]; 

     slide.insertTable(5, 5);

     var tableHeight = slide.getTables()[0].getHeight();

     Logger.log(tableHeight);

}

这是完整的脚本。它工作正常,但是当幻灯片上没有足够的空间时,我需要一个函数来拆分导入的表格。

function getTableFromSpreadsheetoToSlides(){

  var presentation = SlidesApp.openById('myPresentationId');
  var slideId = "mySlideId";
  var slides = presentation.getSlides();
  var slide = slides.filter(function(e){return e.getObjectId() == slideId})[0]; 

  var spreadsheet = SpreadsheetApp.openById('mySpreadsheetId');
  var sheet = spreadsheet.getSheetByName('ActionItems');

  var numRows = sheet.getDataRange().getNumRows();
  var numColumns = sheet.getDataRange().getNumColumns();

  var values = sheet.getSheetValues(1, 1, numRows, numColumns).valueOf();

  var table = slide.getTables()[0];

  var numRowsToDelete = table.getNumRows() - 1;

  // remove old tableRows except the table head
  for (i = numRowsToDelete; i > 0; i--) {
    table.getRow(i).remove();
  }

  // new imported table rows append to the existing table head
  for ( var i = 1; i < numRows; i++ ) {

      table.appendRow();

      for ( var j = 0; j < numColumns; j++ ) {

        var text = table.getCell(i, j).getText().setText(values[i][j]);

      }

      // HERE I need a query how long the table in slide is. If it is longer/higher than the slide is, it should be split and the next row should go to a new slide

  }
}
4

2 回答 2

2

这个解决方法怎么样?getHeight()正如@Randy D 所说,不能用于表格。所以我提出了一个使用 Slides API 的解决方法。

  • 使用Slides.Presentations.Pages.get()Slides API 检索幻灯片信息时,还包括表格信息。在信息中,还包括表格的高度和宽度。
  • 但单位是EMU(英制公制单位),高宽由每个单元格隔开。因此需要在修改单位时对每个高度和宽度求和。

修改后的脚本反映了这一点,如下所示。

要使用此脚本,请在高级 Google 服务API 控制台中启用 Slides API 。

示例脚本:

function getTableHeight(){
  var presentation = SlidesApp.openById('myPresentationId');
  var slides = presentation.getSlides();
  var slideId = 'mySlideId';
  var slide = slides.filter(function(e){return e.getObjectId() == slideId})[0]; 
  slide.insertTable(5, 5);

  // Added scripts from here
  var pageElements = Slides.Presentations.Pages.get(presentation.getId(), slideId).pageElements;
  var result = [];
  for (var i in pageElements) {
    var rowHeight = 0;
    var rowWidth = 0;
    if (pageElements[i].table) {
      for (var j in pageElements[i].table.tableRows) {
        rowHeight += pageElements[i].table.tableRows[j].rowHeight.magnitude / 12700;
      }
      for (var k in pageElements[i].table.tableColumns) {
        rowWidth += pageElements[i].table.tableColumns[k].columnWidth.magnitude / 12700;
      }
      result.push({Height: rowHeight, Width: rowWidth});
    }
  }
  Logger.log(result)
}

笔记 :

  • 输出值的单位是点。
  • pageElements[i].table.tableRows[j].rowHeight.magnitude因为每个点有 12,700 个 EMU,所以检索到的每个值pageElements[i].table.tableColumns[k].columnWidth.magnitude都需要除以 12,700。
  • 当幻灯片中有多个表格时,此示例脚本会检索每个表格的宽度和高度。

参考 :

编辑 :

附加脚本流程:

  1. 检索幻灯片的页面高度。
  2. 检索现有表的一行的高度。
    • 在您的脚本中,该表只有一行。
  3. 计算要追加的行数。
  4. 计算剩余的行。
  5. 从电子表格中添加行和值。

修改后的脚本:

function getTableFromSpreadsheetoToSlides(){

  var presentation = SlidesApp.openById('myPresentationId');
  var slideId = "mySlideId";
  var slides = presentation.getSlides();
  var slide = slides.filter(function(e){return e.getObjectId() == slideId})[0]; 

  var spreadsheet = SpreadsheetApp.openById('mySpreadsheetId');
  var sheet = spreadsheet.getSheetByName('ActionItems');

  var numRows = sheet.getDataRange().getNumRows();
  var numColumns = sheet.getDataRange().getNumColumns();

  var values = sheet.getSheetValues(1, 1, numRows, numColumns).valueOf();

  var table = slide.getTables()[0];

  var numRowsToDelete = table.getNumRows() - 1;

  // remove old tableRows except the table head
  for (i = numRowsToDelete; i > 0; i--) {
    table.getRow(i).remove();
  }

  // From here, I added and modified script.
  var pageHeight = Slides.Presentations.get(presentation.getId()).pageSize.height.magnitude / 12700;
  var rowHeight = getTableHeight(presentation.getId(), slideId);
  var additionalRows = Math.floor(pageHeight / rowHeight);
  var remainingRows = numRows - additionalRows; // You can add the remaining rows using this.
  for ( var i = 1; i < additionalRows; i++ ) { // Modified
    table.appendRow();
    for ( var j = 0; j < numColumns; j++ ) {
      var text = table.getCell(i, j).getText().setText(values[i][j]);
    }
  }
}

function getTableHeight(slidesId, slideId) {
  var pageElements = Slides.Presentations.Pages.get(slidesId, slideId).pageElements;
  var result = [];
  for (var i in pageElements) {
    var rowHeight = 0;
    var rowWidth = 0;
    if (pageElements[i].table) {
      for (var j in pageElements[i].table.tableRows) {
        rowHeight += pageElements[i].table.tableRows[j].rowHeight.magnitude / 12700;
      }
      for (var k in pageElements[i].table.tableColumns) {
        rowWidth += pageElements[i].table.tableColumns[k].columnWidth.magnitude / 12700;
      }
      result.push({Height: rowHeight, Width: rowWidth});
    }
  }
  return result[0].Height;
}

笔记 :

  • 此示例脚本可用于每个单元格高度相同的情况,如您所说的“每一行具有相同的高度”。
  • getTableHeight()可用于带有多个表格的幻灯片。但在这种情况下,它假设幻灯片中有一个表格。
  • 此示例脚本可用于表已存在的情况。因为在一次运行时,创建表时,创建的表无法检索。就算用了也没办法saveAndClose()。我不知道原因。
    • 因此,在解决此问题之前,请将此示例脚本用于创建表格的幻灯片。
于 2017-11-21T02:43:29.690 回答
1

getHeight()方法与表格不兼容。

查看开发者页面上的限制图表:https ://developers.google.com/apps-script/guides/slides/moving-elements

于 2017-11-20T22:32:51.760 回答