Как добавить соединительную линию к презентации Google Slides с помощью скриптов приложения?

Я пытаюсь следовать справочным материалам 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);

}

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

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


person Day4    schedule 30.04.2020    source источник


Ответы (2)


Я считаю вашей целью следующее.

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

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

Пункты модификации:

  • В createLine нет свойства lineProperties.
  • В LineProperties нет свойства lineType.
  • В теле запроса свойство fields не используется.
  • In order to connect 2 shapes with a line, in your situation, how about the following flow?
    1. Create a line object using createLine.
    2. Update the line object using lineProperties.
      • lineProperties can be used for the existing line object using 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 объектов формы queryD200 и queryD201. Так что будьте осторожны.

Использованная литература:

person Tanaike    schedule 01.05.2020
comment
Большое спасибо за ваш быстрый и обстоятельный ответ. Я рассмотрю ваши предложения и дам вам знать, как это происходит. - person Day4; 01.05.2020
comment
Что касается идентификаторов объектов формы, я их придумал, поэтому я знаю, что они верны. - person Day4; 01.05.2020
comment
@ Day4 Спасибо за ответ. Я добавил еще один пример скрипта без использования Slides API. Можно оба скрипта. Если я неправильно понял ваш вопрос, прошу прощения. - person Tanaike; 01.05.2020
comment
Это отлично сработало, моя проблема заключалась в том, что я не понимал, что мне нужно сначала создать строку, а затем изменить ее с помощью updateLineProperties в отдельном запросе. Мне нравится, насколько гладко ваше второе предложение, однако я решил использовать первое, потому что мне нужно было нарисовать более 400 линий. Итак, я создал цикл для перемещения объектов создания строки и обновления строки в массив запроса. потом закинул все через пакетное обновление ... ча-цзин сработало как шарм. Еще раз спасибо - person Day4; 01.05.2020
comment
@ Day4 Спасибо за ответ. Я рад, что ваша проблема решена. И тебе спасибо. - person Tanaike; 01.05.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);

}
person Day4    schedule 01.05.2020