Google apps script Google幻灯片:未找到新插入的表
我想知道发生了什么事。我有两个函数,当一个接一个地调用时,它们都工作得很好:Google apps script Google幻灯片:未找到新插入的表,google-apps-script,google-slides-api,Google Apps Script,Google Slides Api,我想知道发生了什么事。我有两个函数,当一个接一个地调用时,它们都工作得很好: function createTable() { var slidesPage = SlidesApp.openById('1QWRV4eQzGNNBz4SkR3WPurTL3O60oGYxQpBu63KrUoI').getSlides()[0]; var table = slidesPage.insertTable(7, 4); } function changeColumnWidth() { v
function createTable() {
var slidesPage = SlidesApp.openById('1QWRV4eQzGNNBz4SkR3WPurTL3O60oGYxQpBu63KrUoI').getSlides()[0];
var table = slidesPage.insertTable(7, 4);
}
function changeColumnWidth() {
var slidesPage = SlidesApp.openById('1QWRV4eQzGNNBz4SkR3WPurTL3O60oGYxQpBu63KrUoI').getSlides()[0];
var tableId = slidesPage.getTables()[0].getObjectId();
var requests = [{
updateTableColumnProperties: {
objectId: tableId,
"columnIndices": [ 1, 3],
"tableColumnProperties": {
"columnWidth": {
"magnitude": 80,
"unit": "PT"
}
},
"fields": "columnWidth"
}
}];
var createSlideResponse = Slides.Presentations.batchUpdate({
requests: requests
}, '1QWRV4eQzGNNBz4SkR3WPurTL3O60oGYxQpBu63KrUoI');
}
但尝试将这两种功能结合起来,如:
function combined() {
createTable();
changeColumnWidth();
}
我得到一个错误:
无效的请求[0]。updateTableColumnProperties:找不到对象(幻灯片\u API456304911\u 0)
想知道insertTable
方法是否是异步的,因此创建的表还没有准备好?
谢谢你的帮助 为了实现您的目标—在一个函数中创建具有指定布局和特定列大小的表—您应该在整个任务中使用幻灯片API。Slides API允许您在同一批处理请求中创建和修改同一元素,前提是您为该元素提供了唯一的对象ID。否则,您必须首先创建元素,然后使用在对第一个请求的响应中找到的
objectId
发送修改请求。第二种方法本质上是单独完成函数调用时所经历的行为
当然,用户提供的ID有限制:
objectId字符串:用户提供的对象ID。如果指定ID,则该ID在演示文稿中的所有页面和页面元素中必须是唯一的。ID必须以字母数字字符或下划线开头(匹配regex[a-zA-Z0-9\]);其余字符可能包括连字符或冒号(匹配regex[a-zA-Z0-9_-:])。ID的长度不得小于5或大于50。
如果未指定ID,将生成唯一的ID 如果允许连字符,我们可以使用
Utilites.getUuid()
方法来帮助提供我们自己独特的对象ID
当混合使用SlidesApp
和Slides
时,谷歌内部优化(例如写缓存)很可能会改变操作顺序。通过将相关任务操作限制为单个服务,我们可以确保所需的对象在需要时可用
本例使用两种方法为batchUpdate
创建对象,并最终创建演示文稿、添加空白幻灯片、添加表格并对其进行修改,然后创建另一张空白幻灯片
function makeCreateTableRequest_(slideId, rows, columns, shouldSupplyID) {
const tablerq = {
rows: rows,
columns: columns,
elementProperties: {
pageObjectId: slideId,
/** size: {
height: {...},
width: {...}
},
transform: { ... } */
}
};
// If asked to use a custom ID (e.g. also going to modify this table), use a unique one.
if (shouldSupplyID)
tablerq.objectId = ("table" + Utilities.getUuid()).slice(0, 50);
return {createTable: tablerq};
}
function makeModifyTableColumnPropsRequest_(tableId, newWidthDimension, indicesArray) {
const rq = {
objectId: tableId,
fields: "columnWidth" // There are no other fields for this request as of 2018-07
};
if (newWidthDimension && newWidthDimension.magnitude !== undefined && newWidthDimension.unit)
rq.tableColumnProperties = { columnWidth: newWidthDimension };
if (indicesArray && indicesArray.length)
rq.columnIndices = indicesArray;
return {updateTableColumnProperties: rq};
}
function createPresentation_() {
const newPres = { title: "API-created Presentation" };
// Presentations are huge... limit the metadata sent back to us.
const fields = "presentationId,pageSize,title"
+ ",slides(objectId,pageType,pageElements(objectId,size,title,description))"
+ ",masters(objectId,pageType,pageElements(objectId,size,title,description))"
+ ",layouts(objectId,pageType,pageElements(objectId,size,title,description))";
const createdMetadata = Slides.Presentations.create(newPres, {fields: fields});
console.log({message:"Created a Presentation", response: createdMetadata});
return createdMetadata;
}
function addSlide_(pId) {
const response = Slides.Presentations.batchUpdate({ requests: [{ createSlide: {} }] }, pId);
return response.replies[0].createSlide.objectId;
}
function foo() {
const pres = createPresentation_();
const newSlideId = addSlide_(pres.presentationId);
// Get requests to add and to modify tables.
const openingTableRq = makeCreateTableRequest_(pres.slides[0].objectId, 2, 4);
const newTableRq = makeCreateTableRequest_(newSlideId, 7, 4, true);
const changeWidthRq = makeModifyTableColumnPropsRequest_(newTableRq.createTable.objectId, {magnitude: 80, unit: "PT"}, [0]);
// Add and update the desired table, then create a new slide.
var response = Slides.Presentations.batchUpdate({
requests: [
openingTableRq, // will have reply
newTableRq, // will have reply
changeWidthRq, // no reply
{ createSlide: {} } // will have reply
]
}, pres.presentationId);
console.log({message: "Performed updates to the created presentation", response: response});
}
这次修改怎么样?请将此视为几种变通方法之一。在我的解决方法中,针对您的情况使用了
saveAndClose()。使用这个,我想分离SlidesApp和SlidesAPI的过程
修改点:
- 插入表格后,使用
saveAndClose()
保存并关闭幻灯片
- 返回插入表的对象ID以在
changeColumnWidth()
处使用
- 在
changeColumnWidth()
修改脚本:
注:
- 对于通过
saveAndClose()
保存和关闭的幻灯片,当幻灯片重新打开时,无法检索插入的表。再次尝试使用getTables()
检索表时,长度变为0。但在SlidesAPI中,可以检索表的对象ID。所以我认为,在插入表之后,通过返回表的对象ID,可以解决这个问题。
- 但是我不明白为什么重新打开的幻灯片中的
getTables()
检索到的值变为“0”。对不起
参考:
如果此解决方案不是您想要的,我很抱歉。发送批处理请求时,在执行任何请求之前,都会对其进行验证。如果有无效,则批处理不运行。考虑验证通过Apple脚本检索的ID与从幻灯片获得的相同表的ID相同。API@tehhowch是的,他们是同一个名字。谢谢
function combined() {
var tableId = createTable(); // Modified
changeColumnWidth(tableId); // Modified
}
function createTable() {
var slide = SlidesApp.openById('1QWRV4eQzGNNBz4SkR3WPurTL3O60oGYxQpBu63KrUoI'); // Modified
var slidesPage = slide.getSlides()[9]; // Modified
var table = slidesPage.insertTable(7, 4);
slide.saveAndClose(); // Added
return table.getObjectId();
}
function changeColumnWidth(tableId) { // Modified
// var slidesPage = SlidesApp.openById('1QWRV4eQzGNNBz4SkR3WPurTL3O60oGYxQpBu63KrUoI').getSlides()[0]; // This line is not used.
// var tableId = slidesPage.getTables()[0].getObjectId(); // This line is not used because slidesPage.getTables().length becomes 0.
var requests = [{
updateTableColumnProperties: {
objectId: tableId,
"columnIndices": [ 1, 3],
"tableColumnProperties": {
"columnWidth": {
"magnitude": 80,
"unit": "PT"
}
},
"fields": "columnWidth"
}
}];
var createSlideResponse = Slides.Presentations.batchUpdate({
requests: requests
}, '1QWRV4eQzGNNBz4SkR3WPurTL3O60oGYxQpBu63KrUoI');
}