2

我已经安装了谷歌幻灯片 API,它运行良好。我可以添加和修改幻灯片,但我需要按 id 复制特定幻灯片。我遵循文档 GOOGLE SLIDE API,我发现这个函数Google slide api duplicate object但它给了我错误。这是我的代码功能:

'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

我的 id 幻灯片g796f0ce3dc2930a6_1如下所示:

在此处输入图像描述

4

3 回答 3

1

5/26 更新:Slides API 现在支持将 ReplaceAllTestRequest 限制为单个页面。更新了答案以反映。

DuplicateObjectRequest 是用于复制幻灯片的正确请求。但是,该objectIds参数并没有按照您的想法执行:它将现有幻灯片中页面元素的 objectIds 映射到您希望它们在新幻灯片中具有的 objectId。类似的东西{{ARTICLE_NAME}}不是objectIds,而是表格单元格中的文本。

要替换幻灯片中的文本,您可以使用ReplaceAllTextRequest。您可以使用该pageObjectIds请求中的参数将替换限制为仅您创建的重复幻灯片。确保在 DuplicateObjectRequest 中指定了一个将分配给新幻灯片的 objectId。

于 2017-02-15T23:30:21.300 回答
1

这是我解决该问题的解决方案:

  1. 第 1 步 - 创建一个包含幻灯片的演示文稿
  2. 第 2 步 - 创建一个空白演示文稿
  3. 第 3 步 - 使用我创建的此函数调用要复制幻灯片的演示文稿:

注意:$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-slide 上获得https://docs.google.com/presentation/d/{{presentationId}}/edit#slide=id.p 所有此功能:

  • 创建幻灯片()
  • 执行请求
  • 创建形状
  • 插入文本
  • 更新文本样式
  • 替换文本
  • 替换AllShapesWithImage
  • 创建表
  • ...

您可以在 Google slide API Doc.it 上找到如何创建它非常简单。好看!。

于 2017-02-20T12:45:13.473 回答
1

我认为您要做的是复制一张幻灯片,然后替换文本。我遇到过同样的问题。

1- 使用duplicateObject复制幻灯片,分配一个新的对象 ID。这非常重要(检查文档以查看有效值)。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

于 2018-06-22T05:58:45.780 回答