如何使用应用程序脚本将连接线添加到 google 幻灯片演示文稿?

How do you add a connecting line to a google slides presentation using app scripts?

我正在尝试关注 Google 幻灯片 API 参考 material; 'Lines' 但我一定错过了什么。我已经使用脚本成功添加了矩形形状,但现在我想用一条线将它们连接起来。这是我目前所拥有的:

function addConnections()
{
  var myPresentation = SlidesApp.getActivePresentation()
  var presentationId = myPresentation.getId();
  var slideId = myPresentation.getSlides()[0].getObjectId()

  var requests = []

    requests.push(
    {
      createLine: 
      {
        lineProperties: 
        {
          startConnection: 
          {
            connectedObjectId: 'queryD200',
            connectionSiteIndex: 3
          },
          endConnection: 
          {
            connectedObjectId: 'queryD201',
            connectionSiteIndex: 0
          }
        },
        lineType: 'CURVED_CONNECTOR_2'
      }
    })

  Slides.Presentations.batchUpdate({requests: requests}, presentationId);

}

我得到的错误是: 'requests[0].create_line' 处的未知名称 "lineType":找不到字段。 'requests[0].create_line' 处的未知名称 "lineProperties":找不到字段。

但这些是 google 在其文档中使用的确切字段名称。 我试过带引号和不带引号。请帮忙!谢谢

我相信你的目标如下。

  • 您想在 Google 幻灯片上用一条线连接 2 个形状。
  • 您想使用带 Google Apps 脚本的幻灯片 API 来实现此目的。

为此,这个答案怎么样?

修改点:

  • createLine中没有属性个lineProperties
  • LineProperties中没有属性个lineType
  • 在您的请求正文中,fields 的 属性 未被使用。
  • 为了用一条线连接2个形状,在你的情况下,下面的流程怎么样?
    1. 使用 createLine 创建线对象。
    2. 使用 lineProperties 更新线对象。
      • lineProperties 可用于使用 UpdateLinePropertiesRequest 的现有线对象。

修改后的脚本:

当你的脚本修改后,变成如下。

function addConnections() {
  var myPresentation = SlidesApp.getActivePresentation()
  var presentationId = myPresentation.getId();
  var slideId = myPresentation.getSlides()[0].getObjectId();

  var lineObjectId = "sampleline001";
  var startShape = "queryD200";
  var endShape = "queryD201";

  var requests = [
    {createLine: {
      objectId: lineObjectId,
      lineCategory: "CURVED",
      elementProperties: {pageObjectId: slideId, size: {height: {magnitude: 1 ,unit: "PT"}, width: {magnitude: 1, unit: "PT"}}}
    }},
    {updateLineProperties: {
      objectId: lineObjectId,
      lineProperties: {startConnection: {connectedObjectId: startShape}, endConnection: {connectedObjectId: endShape}},
      fields: "startConnection,endConnection"
    }}
  ];
  Slides.Presentations.batchUpdate({requests: requests}, presentationId);
}

示例脚本:

作为另一种模式,您也可以使用 Slides service 而不是幻灯片 API。

function addConnections() {
  var myPresentation = SlidesApp.getActivePresentation()
  var presentationId = myPresentation.getId();
  var slide = myPresentation.getSlides()[0];
  var slideId = slide.getObjectId();

  var startShape = "queryD200";
  var endShape = "queryD201";

  var line = slide.insertLine(
    SlidesApp.LineCategory.CURVED,
    slide.getPageElementById(startShape).asShape().getConnectionSites()[0],
    slide.getPageElementById(endShape).asShape().getConnectionSites()[0]
  );
}

结果:

当上面两个脚本都是运行2个形状时,可以得到如下结果

注:

  • 我不确定形状对象 ID queryD200queryD201 是否正确。所以请注意这一点。

参考文献:

@Tanaike 我提供了我最终使用的代码,以防它对其他人有用。 'arrayCon' 是我需要与线连接的 elementId 对数组。有超过 400 对,但将它们一起批处理成一个请求数组非常有效,只需不超过 3 或 4 秒即可完成。

for(var i = 0;i<arrayCon.length;i++)
  {
    var lineId = 'lineConn'+i;
    var startCon = arrayCon[i][0]
    var endCon = arrayCon[i][1]

    requests.push(
    {
      createLine: 
      {
        objectId: lineId,
        lineCategory: 'CURVED',
        elementProperties: {pageObjectId: slideId, size: {height: {magnitude: 1 ,unit: "PT"}, width: {magnitude: 1, unit: "PT"}}}
      }
    })
    requests.push(
    {
      updateLineProperties: 
      {
        objectId: lineId,
        fields: 'startConnection,endConnection',
        lineProperties: 
        {
          startConnection:
          {
            connectedObjectId: startCon,
            connectionSiteIndex: 2
          },
          endConnection:
          {
            connectedObjectId: endCon,
            connectionSiteIndex: 0
          }
        }
      }
    })

  }

  Slides.Presentations.batchUpdate({requests: requests}, presentationId);

}