Я пытаюсь динамически обновить диаграмму, встроенную в Google Slides, но у меня возникает ошибка.
Это функция, которую я придумал для замены определенного текста, размещенного на моем базовом слайде Google.
public function getGoogleDrivePdf($fileId, $substitutions)
{
$client = $this->getGoogleClient();
$driveService = new \Google_Service_Drive($client);
$slidesService = new \Google_Service_Slides($client);
$copy = new \Google_Service_Drive_DriveFile([
'name' => $substitutions['student_name'] . ' presentation',
]);
$driveResponse = $driveService->files->copy($fileId, $copy);
$slideFileId = $driveResponse->id;
$requests = [];
foreach ($substitutions as $key => $value) {
$requests[] = new \Google_Service_Slides_Request(
[
'replaceAllText' => [
'containsText' => [
'text' => '{{'.$key.'}}',
'matchCase' => true
],
'replaceText' => $value
]
]
);
}
$requests[] = new \Google_Service_Slides_Request(
[
'createSheetsChart' => [
'spreadsheetId' => 'N_St1Lm-oxd4aWOjQ6o.......',
'chartId' => ...040....,
'linkingMode' => 'NOT_LINKED_IMAGE',
'elementProperties' => [
'pageObjectId' => '.....9fd6d_.....',
'size' => [
'height' => $emu4M,
'width' => $emu4M
],
'transform' => [
'scaleX' => 1,
'scaleY' => 1,
'translateX' => 100000,
'translateY' => 100000,
'unit' => 'EMU'
]
]
]
]
);
$batchUpdateRequest = new \Google_Service_Slides_BatchUpdatePresentationRequest([
'requests' => $requests,
]);
$updateResponse = $slidesService->presentations->batchUpdate($slideFileId, $batchUpdateRequest);
$response = $driveService->files->export(
$slideFileId,
'application/pdf',
[
'alt' => 'media',
]
);
$content = $response->getBody()->getContents();
$driveService->files->delete($slideFileId);
// Download
$response = new Response();
$response->headers->set('Content-Type', 'application/pdf');
$response->headers->set('Content-Disposition', 'attachment; filename = "' . $substitutions['slide_filename'] . '"');
$response->setContent($content);
return $response;
}
Эта функция заменяет нужный мне текст в слайде Google и без проблем загружает слайд в виде PDF-файла.
Но теперь я хочу добавить диаграмму на слайд и динамически изменять значения диаграммы. Я попытался сделать это, изменив значения в исходном листе Google на заменяемый текст, но это выдает мне эту ошибку.
{ "ошибка": { «код»: 400, "message": "Неверные запросы[9].createSheetsChart: указанную диаграмму не удалось найти в электронной таблице.", "ошибки": [ { "message": "Неверные запросы[9].createSheetsChart: указанную диаграмму не удалось найти в электронной таблице.", "домен": "глобальный", "причина": "badRequest" } ], "статус": "INVALID_ARGUMENT" } }
Есть идеи, как это исправить или какие-нибудь обходные пути?
@Tanaike - я обновил код и обнаружил ошибку. Я имею в виду эту страницу Developers.google.com/slides/api/guides/add-chart#php
Спасибо за ответ. Из вашего обновленного сценария я понял, что вы хотите вставить новую диаграмму из электронной таблицы в слайд. Могу ли я спросить вас о деталях связи вашего обновленного сценария и change the chart values dynamically? Кстати, я думаю, что ошибка The specified chart could not be found in the spreadsheet." связана с тем, что идентификатор диаграммы не найден в электронной таблице. Итак, я до сих пор не могу понять ваш ожидаемый результат. Могу ли я спросить вас о деталях?
Например, хотите ли вы просто обновить диаграмму, вставленную из электронной таблицы в Google Slide с помощью API Google Slides? Я не могу понять dynamically, чего вы ожидаете. Я глубоко извиняюсь за мое плохое знание английского языка.
Студенты сайта должны иметь возможность скачать отчет. Таким образом, текст отчета, а также данные диаграммы должны меняться в зависимости от того, какой студент загружает отчет. В своих слайдах Google я установил заменяемый текст, например {{this_is_replace_text_1}}. Также я добавил диаграмму, чтобы можно было динамически изменять данные, но она не работает.
Спасибо за ответ. Я должен еще раз извиниться за мое очень плохое знание английского языка. К сожалению, я не могу понять dynamically из Also I added a chart so I can change the data dynamically, but it doesn't work.. Могу ли я спросить вас о деталях dynamically, которых вы ожидаете? В вашей ситуации вы хотите заменить заполнитель на слайде диаграммой в электронной таблице и обновить диаграмму? Или вы хотите обновить существующую диаграмму на слайде?
Например, пользователь1 набрал за экзамен 40% баллов, а пользователь2 — 80%. Когда каждый пользователь просматривает/загружает отчет, я хочу отображать оценки на диаграмме (пользователь будет видеть только свои оценки на диаграмме)






Наконец, после многих поисков я нашел решение.
Сначала вам необходимо обновить значения Google Sheet, которые являются источником графика из отдельного запроса, прежде чем что-либо делать с презентацией/Google Slide.
Ниже приведена моя функция для обновления значений Google Sheet.
/**
* @param $sheetId - Example: loi973hhbshbh3gf3f765f
* @param $valueNrange - Example: [['range' => 'A1', 'value' => '20']]
* @param $valueInputOption - https://developers.google.com/sheets/api/reference/rest/v4/ValueInputOption
*/
public function updateGoogleSheetValues ($sheetId, $valueNrange, $valueInputOption = "RAW") {
try {
$client = $this->getGoogleClient();
$driveService = new \Google_Service_Drive($client);
$sheetsService = new \Google_Service_Sheets($client);
$data = [];
foreach ($valueNrange as $dataItem) {
$data[] = new \Google_Service_Sheets_ValueRange([
'range' => $dataItem['range'],
'values' => [[$dataItem['value']]]
]);
}
$dataBody = new \Google_Service_Sheets_BatchUpdateValuesRequest([
'valueInputOption' => $valueInputOption,
'data' => $data
]);
$result = $sheetsService->spreadsheets_values->batchUpdate($sheetId, $dataBody);
}
catch (\Exception $exception) {
return false;
}
return true;
}
После обновления значений Google Sheet вы можете обновить график/диаграмму в презентации/Google Slide и загрузить.
Ниже приведена моя функция обновления диаграммы и загрузки слайда в формате PDF.
public function getGoogleSlidesPdf($fileId, $substitutions, $elementOptions = [])
{
$client = $this->getGoogleClient();
$driveService = new \Google_Service_Drive($client);
$slidesService = new \Google_Service_Slides($client);
$copy = new \Google_Service_Drive_DriveFile([
'name' => $substitutions['student_name'] . ' presentation',
]);
$driveResponse = $driveService->files->copy($fileId, $copy);
$certificateFileId = $driveResponse->id;
$requests = [];
$emu4M = ['magnitude' => 4000000, 'unit' => 'EMU'];
foreach ($substitutions as $key => $value) {
$requests[] = new \Google_Service_Slides_Request(
[
'replaceAllText' => [
'containsText' => [
'text' => '{{'.$key.'}}',
'matchCase' => true
],
'replaceText' => $value
]
]
);
}
$requests[] = new \Google_Service_Slides_Request([
'refreshSheetsChart' => [
'objectId' => 'g*********_0_0'
]
]);
$batchUpdateRequest = new \Google_Service_Slides_BatchUpdatePresentationRequest([
'requests' => $requests,
]);
$updateResponse = $slidesService->presentations->batchUpdate($certificateFileId, $batchUpdateRequest);
// uncomment the below line and set a breakpoint to find the "objectId" of chart or object from sheet objects if the chart or object is moved or edited (move front or back)
// because the "objectId" will change when the chart or element is moved
//$presentationObjects = $slidesService->presentations->get($certificateFileId);
$response = $driveService->files->export(
$certificateFileId,
'application/pdf',
[
'alt' => 'media',
]
);
$content = $response->getBody()->getContents();
$driveService->files->delete($certificateFileId);
// Download
$response = new Response();
$response->headers->set('Content-Type', 'application/pdf');
$response->headers->set('Content-Disposition', 'attachment; filename = "' . $substitutions['certification_filename'] . '"');
$response->setContent($content);
return $response;
}
О
now I want to add a chart to the slide and change the chart values dynamically. I tried to accomplish this by changing the values in source Google Sheet to replaceable text but It throws me this error., можете ли вы предоставить свой текущий сценарий?