开发者问题收集

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

2020-04-30
717

我正在尝试遵循 Google Slides API 参考资料; '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 在其文档中使用的确切字段名称。 我尝试了带引号和不带引号的两种方式。请帮忙!谢谢

2个回答

我认为您的目标如下。

  • 您想在 Google Slides 上用一条线连接 2 个形状。
  • 您想使用带有 Google Apps Script 的 Slides 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 服务 而不是 Slides 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
2020-05-01

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

}
Day4
2020-05-01