getTables().getHeight 不起作用

getTables().getHeight does not work

我在空白幻灯片中插入 table。然后我用不同的文本填充它。在此之后我想获得 table 的高度。 .getHeight 的结果为空。 .getHeight 方法适用于形状和图像,但不适用于 tables。如何获得 table 高度?

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);

}

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

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

  }
}

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

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

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

的解决方法
  • 当使用幻灯片 API 的 Slides.Presentations.Pages.get() 检索幻灯片信息时,table 的信息也包括在内。资料中还包括table的高和宽
  • 但是单位是EMU(English Metric Unit),高和宽是用每个格子隔开的。所以在修改单位的时候需要对每个高和宽求和。

修改后的脚本反映如下。

为了使用此脚本,请在 Advanced Google Services and API console 启用幻灯片 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)
}

注:

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

参考:

编辑:

附加脚本的流程:

  1. 检索幻灯片的页面高度。
  2. 检索现有 table 的一行的高度。
    • 在您的脚本中,table 只有一行。
  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;
}

注:

  • 此示例脚本可用于每个单元格高度相同的情况,如您所说"each row has the same height"。
  • getTableHeight() 可用于具有多个 table 的幻灯片。但在这种情况下,它假设幻灯片中有一个table。
  • 此示例脚本可用于 table 已经存在的情况。因为在一个运行中创建table时,创建的table无法检索。用saveAndClose()也不行。我不知道原因。
    • 因此,在解决此问题之前,请将此示例脚本用于创建 table 的幻灯片。