Как дублировать слайд с помощью API Google слайдов

Я установил API слайдов Google, и он отлично работает. Я могу добавлять и изменять слайд, но мне нужно продублировать определенный слайд по идентификатору. Я следую документации GOOGLE SLIDE API, и я нашел эту функцию API слайдов Google повторяющийся объект, но это дает мне ошибку. это моя функция кода:

'duplicateObject'=>array(
    'objectId'=>'g796f0ce3dc2930a6_1',
    'objectIds'=>array(
        '{{ARTICLE_NAME}}'=>'Article_1',
        '{{ARTICLE_PRICE}}'=> '100',
        '{{ARTICLE_QT}}'=>'5',
        '{{ARTICLE_HT}}'=>'500',
    ),
),

И это ошибка:

Invalid requests[0].duplicateObject: The object with objectId ARTICLE_NAME could not be found

Мой слайд с идентификатором g796f0ce3dc2930a6_1 выглядит так:

введите здесь описание изображения


person Malki Mohamed    schedule 15.02.2017    source источник


Ответы (3)


Это мое решение этой проблемы:

  1. шаг 1 - создать одну презентацию со слайдовой таблицей
  2. шаг 2 - создать пустую презентацию
  3. Шаг 3 - вызовите презентацию, в которой нужно было продублировать слайд, используя эту функцию, которую я создал:

NB: $external_page содержит все слайды вашей презентации, поэтому вы можете зацикливаться на нем вот так

    public function createSingleSlide(array $slide_elements,string         $presentationId,string $id_slide_multiple){
    $external_page = $this->getPresentation($presentationId);
    $index = 0;
    foreach ($external_page['slides'] as $key => $value) {

        if($value['objectId'] != $id_slide_multiple ){

            // create a blank slide
            $slideId = 'slide_'.rand();
            $requests_slide = $this->createSlide($slideId,$index);
            $response = $this->executeRequest($requests_slide);

            foreach ($value['pageElements'] as $key_pe => $value_pe) {

                // we have to do test here if shape or table
                if(isset($value_pe['shape'])){

                    $shapeType  = $value_pe['shape']['shapeType'];
                    $elementId  = $shapeType.'_'.rand();
                    $textElements =  $value_pe['shape']['text']['textElements'];

                    $requests = $this->createShape($elementId,$shapeType,$slideId,$value_pe['size'],$value_pe['transform']);

                    $response = $this->executeRequest($requests);

                    //insert all text of shape, table...etcs
                    foreach ($textElements as $key_text => $value_text) {

                        $text = $value_text['textRun']['content'];

                        if(isset($text) && !empty($text && $text !="\n") ){

                            $requests_text = $this->insertText($elementId,$text);
                            $response = $this->executeRequest($requests_text);

                            $requests_style = $this->updateTextStyle($elementId,$value_text['textRun']['style']);
                            $response = $this->executeRequest($requests_style);
                        }
                    }
                }elseif (isset($value_pe['table'])) {

                    $rows       = $value_pe['table']['rows'];
                    $columns    = $value_pe['table']['columns'];
                    $elementId  = 'Table_'.rand();

                    $requests_table = $this->createTable($elementId,$slideId,$value_pe['size'],$value_pe['transform'],$rows,$columns);
                    $response = $this->executeRequest($requests_table);

                    // insert all rows in table
                    foreach ($value_pe['table']['tableRows'] as $key_rows => $value_rows) {
                        foreach ($value_rows['tableCells'] as $key_cells => $value_cells) {

                            $textElements           = $value_cells['text']['textElements'];
                            $tableCellProperties    = $value_cells['tableCellProperties'];
                            $location               = array();
                            $rowSpan                = $value_cells['rowSpan'];
                            $columnSpan             = $value_cells['columnSpan'];

                            if(isset($value_cells['location']['rowIndex'])){
                                $location['rowIndex'] = $value_cells['location']['rowIndex'];
                            }
                            if(isset($value_cells['location']['columnIndex'])){
                                $location['columnIndex'] = $value_cells['location']['columnIndex'];
                            }

                            //insert all text of shape, table...etcs
                            foreach ($textElements as $key_text => $value_text) {

                                $text = $value_text['textRun']['content'];
                                $requests_text_and_style =array();

                                if(isset($text) && !empty($text && $text !="\n") ){

                                    $requests_text_and_style[] = $this->insertTableText($elementId,$text,$location);

                                    $requests_text_and_style[] = $this->updateTableCellProperties($elementId,$tableCellProperties,$location,$rowSpan,$columnSpan);

                                    $requests_text_and_style[] = $this->updateTextStyleTable($elementId,$value_text['textRun']['style'],$location);

                                    $response = $this->executeRequest($requests_text_and_style);
                                }
                            }
                        }
                    }

                }
            }

            // replace varaibales in slide $slideId
            $requests_texts = array(); 

            if(isset($slide_elements['replaceText'])){
                $requests_texts[] = $this->replaceText($slide_elements['replaceText']);
            }
            if(isset($slide_elements['replaceAllShapesWithImage'])){
                $requests_texts[] = $this->replaceAllShapesWithImage($slide_elements['replaceAllShapesWithImage']);
            }

            $response = $this->executeRequest($requests_texts);
            $index++;
        }

    }
}

Вы можете получить $presentationId на своей ссылке презентации G-слайд https://docs.google.com/presentation/d/{{presentationId}}/edit#slide=id.p Все это функции:

  • createSlide ()
  • executeRequest
  • createShape
  • insertText
  • updateTextStyle
  • replaceText
  • replaceAllShapesWithImage
  • createTable
  • ...

Вы можете найти, как его создать, в Google Slide API Doc.it очень просто. Хороший взгляд !.

person Malki Mohamed    schedule 20.02.2017

Обновление от 26 мая: API слайдов теперь поддерживает ограничение ReplaceAllTestRequest отдельными страницами. Обновил ответ, чтобы отразить.

DuplicateObjectRequest - правильный запрос для дублирования слайда. Однако параметр objectIds не делает того, что вы думаете: он сопоставляет objectIds из элементов страницы в вашем существующем слайде с objectId, который вы хотите, чтобы они были на вашем новом слайде. Такие вещи, как {{ARTICLE_NAME}}, не являются идентификаторами объекта, это текст в ячейках таблицы.

Чтобы заменить этот текст на слайдах, вы можете использовать ReplaceAllTextRequest . Вы можете использовать параметр pageObjectIds в этом запросе, чтобы ограничить замену только дубликатом слайда, который вы создали. Убедитесь, что вы указали objectId в DuplicateObjectRequest, который будет назначен новому слайду.

person Maurice Codik    schedule 15.02.2017

Я думаю, что вы пытаетесь продублировать слайд, а затем replaceText. Я была такая же проблема.

1. Используйте duplicateObject, чтобы продублировать слайд, назначив новый идентификатор объекта. Это очень важно (проверьте документы, чтобы увидеть допустимые значения). https://developers.google.com/slides/reference/rest/v1/presentations/request#duplicateobjectrequest

2- Используйте replaceAllText, чтобы заменить заполнитель. Обязательно укажите pageObjectId нового повторяющегося объекта. В противном случае замена будет применена ко всем слайдам вашей презентации.

образец:

 {
   duplicateObject: {
     objectId: 'g796f0ce3dc2930a6_1',
     objectIds: { 'g796f0ce3dc2930a6_1': 'NEW_OBJECT_ID' }
   }
 },
 {
   replaceAllText: {
      pageObjectIds: ['NEW_OBJECT_ID'],
      containsText: {
        text: '{{ARTICLE_NAME}}',
        matchCase: true
      },
      replaceText: 'Article_1'
   }
 }

Возможно, вам потребуется добавить больше replaceAllText для всех ваших заполнителей.

person Christian    schedule 22.06.2018