Я установил API Google Slide, и он работает отлично. Я могу добавить и изменить слайд, но мне нужно дублировать конкретный слайд по идентификатору.
Я следую за документацией GOOGLE SLIDE API и нашел эту функцию Google slide api дубликат объекта но это дает мне ошибку.
это моя функция кода:
'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
похоже :
Это мое решение для решения этой проблемы:
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
Все из этой функции:
Вы можете найти, как создать его на Google slide API Doc.it очень просто.
Хорошо выглядишь!
Обновление 5/26: API слайдов теперь поддерживает ограничение ReplaceAllTestRequest для отдельных страниц. Обновлен ответ для отражения.
DuplicateObjectRequest — это правильный запрос для дублирования слайда. Тем не менее objectIds
Параметр не делает то, что вы думаете: он отображает objectIds из элементов страницы в вашем существующем слайде в objectId, который вы хотите, чтобы они были в вашем новом слайде. Вещи как {{ARTICLE_NAME}}
не objectIds, это текст в ячейках таблицы.
Чтобы заменить этот текст в ваших слайдах, вы можете использовать ReplaceAllTextRequest. Вы можете использовать pageObjectIds
параметр в этом запросе, чтобы ограничить замены только дубликат слайда, который вы создали. Убедитесь, что вы указали objectId в DuplicateObjectRequest, который будет назначен новому слайду.
Я думаю, что вы пытаетесь сделать, это дублировать слайд, а затем заменить текст. Я была такая же проблема.
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 для всех ваших заполнителей