Как добавить соединительную линию в презентацию Google Slides с помощью скриптов приложения? - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь следовать справочному материалу Google Slides API; 'Линии' но я должен что-то упустить. Я успешно добавил прямоугольные формы, используя скрипт, но теперь я хочу соединить их линией. Вот что у меня есть:

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

}

Ошибка, которую я получаю: Неизвестное имя «lineType» в «request [0] .create_line»: поле не найдено. Неизвестное имя "lineProperties" в 'request [0] .create_line': не удается найти поле.

Но это именно те имена полей, которые Google использует в своей документации. Я попробовал их как с цитатами, так и без. Пожалуйста помоги! и спасибо

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Я считаю, что ваша цель заключается в следующем.

  • Вы хотите соединить 2 фигуры с линией в Google Slides.
  • Вы хотите добиться этого, используя Slides API с Google Apps Script .

Для этого, как насчет этого ответа?

Точки модификации:

  • В createLine нет свойства lineProperties.
  • Нет свойства lineType в LineProperties.
  • В вашем теле запроса свойство 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]
  );
}

Результат:

Если оба сценария работают над двумя фигурами, можно получить следующий результат:

enter image description here

Примечание:

  • Я не уверен, что идентификаторы объектов формы queryD200 и queryD201 являются правильными. Поэтому, пожалуйста, будьте осторожны.

Ссылки:

0 голосов
/ 01 мая 2020

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

}
...