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.magnitude
和pageElements[i].table.tableColumns[k].columnWidth.magnitude
检索到的每个值都需要除以12,700。
- 当幻灯片中有多个 table 时,此示例脚本会检索每个 table 的宽度和高度。
参考:
编辑:
附加脚本的流程:
- 检索幻灯片的页面高度。
- 检索现有 table 的一行的高度。
- 在您的脚本中,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();
}
// 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 的幻灯片。
我在空白幻灯片中插入 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.magnitude
和pageElements[i].table.tableColumns[k].columnWidth.magnitude
检索到的每个值都需要除以12,700。 - 当幻灯片中有多个 table 时,此示例脚本会检索每个 table 的宽度和高度。
参考:
编辑:
附加脚本的流程:
- 检索幻灯片的页面高度。
- 检索现有 table 的一行的高度。
- 在您的脚本中,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();
}
// 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 的幻灯片。