如何使用 google 幻灯片 api 复制幻灯片
How to duplicate slide using google slide api
我已经安装了 google slide 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
的幻灯片看起来像:
更新 5/26:幻灯片 API 现在支持将 ReplaceAllTestRequest 限制为单个页面。更新了答案以反映。
DuplicateObjectRequest 是用于复制幻灯片的正确请求。但是,objectIds
参数并不像您想象的那样:它将 objectId 从现有幻灯片中的页面元素映射到您希望它们在新幻灯片中具有的 objectId。 {{ARTICLE_NAME}}
之类的东西不是 objectId,那是 table 单元格中的文本。
要替换幻灯片中的该文本,您可以使用 ReplaceAllTextRequest。您可以在该请求中使用 pageObjectIds
参数将替换限制为仅您创建的重复幻灯片。确保在 DuplicateObjectRequest 中指定一个将分配给新幻灯片的 objectId。
这是我解决该问题的方法:
- 第 1 步 - 创建一个包含幻灯片的演示文稿 table
- 第 2 步 - 创建空白演示文稿
- 第 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++;
}
}
}
您可以在 link 演示文稿中获得 $presentationId
G-slide https://docs.google.com/presentation/d/{{presentationId}}/edit#slide=id.p
所有这些功能:
- createSlide()
- 执行请求
- 创建形状
- 插入文本
- 更新文本样式
- 替换文字
- replaceAllShapesWithImage
- 创建表
- ...
您可以在 Google 幻灯片 API Doc.it 上找到如何创建它非常简单。
好看!.
我认为您想要做的是复制一张幻灯片,然后替换文本。我遇到过同样的问题。
1- 使用duplicateObject复制一张幻灯片,分配一个新的Object 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
我已经安装了 google slide 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
的幻灯片看起来像:
更新 5/26:幻灯片 API 现在支持将 ReplaceAllTestRequest 限制为单个页面。更新了答案以反映。
DuplicateObjectRequest 是用于复制幻灯片的正确请求。但是,objectIds
参数并不像您想象的那样:它将 objectId 从现有幻灯片中的页面元素映射到您希望它们在新幻灯片中具有的 objectId。 {{ARTICLE_NAME}}
之类的东西不是 objectId,那是 table 单元格中的文本。
要替换幻灯片中的该文本,您可以使用 ReplaceAllTextRequest。您可以在该请求中使用 pageObjectIds
参数将替换限制为仅您创建的重复幻灯片。确保在 DuplicateObjectRequest 中指定一个将分配给新幻灯片的 objectId。
这是我解决该问题的方法:
- 第 1 步 - 创建一个包含幻灯片的演示文稿 table
- 第 2 步 - 创建空白演示文稿
- 第 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++;
}
}
}
您可以在 link 演示文稿中获得 $presentationId
G-slide https://docs.google.com/presentation/d/{{presentationId}}/edit#slide=id.p
所有这些功能:
- createSlide()
- 执行请求
- 创建形状
- 插入文本
- 更新文本样式
- 替换文字
- replaceAllShapesWithImage
- 创建表
- ...
您可以在 Google 幻灯片 API Doc.it 上找到如何创建它非常简单。 好看!.
我认为您想要做的是复制一张幻灯片,然后替换文本。我遇到过同样的问题。
1- 使用duplicateObject复制一张幻灯片,分配一个新的Object 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