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