Как динамически обновлять диаграмму в Google Slides?

Я пытаюсь динамически обновить диаграмму, встроенную в 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" } }

Есть идеи, как это исправить или какие-нибудь обходные пути?

О 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., можете ли вы предоставить свой текущий сценарий?

Tanaike 14.06.2024 08:48

@Tanaike - я обновил код и обнаружил ошибку. Я имею в виду эту страницу Developers.google.com/slides/api/guides/add-chart#php

Dula 14.06.2024 09:15

Спасибо за ответ. Из вашего обновленного сценария я понял, что вы хотите вставить новую диаграмму из электронной таблицы в слайд. Могу ли я спросить вас о деталях связи вашего обновленного сценария и change the chart values dynamically? Кстати, я думаю, что ошибка The specified chart could not be found in the spreadsheet." связана с тем, что идентификатор диаграммы не найден в электронной таблице. Итак, я до сих пор не могу понять ваш ожидаемый результат. Могу ли я спросить вас о деталях?

Tanaike 14.06.2024 09:39

Например, хотите ли вы просто обновить диаграмму, вставленную из электронной таблицы в Google Slide с помощью API Google Slides? Я не могу понять dynamically, чего вы ожидаете. Я глубоко извиняюсь за мое плохое знание английского языка.

Tanaike 14.06.2024 09:44

Студенты сайта должны иметь возможность скачать отчет. Таким образом, текст отчета, а также данные диаграммы должны меняться в зависимости от того, какой студент загружает отчет. В своих слайдах Google я установил заменяемый текст, например {{this_is_replace_text_1}}. Также я добавил диаграмму, чтобы можно было динамически изменять данные, но она не работает.

Dula 16.06.2024 01:55

Спасибо за ответ. Я должен еще раз извиниться за мое очень плохое знание английского языка. К сожалению, я не могу понять dynamically из Also I added a chart so I can change the data dynamically, but it doesn't work.. Могу ли я спросить вас о деталях dynamically, которых вы ожидаете? В вашей ситуации вы хотите заменить заполнитель на слайде диаграммой в электронной таблице и обновить диаграмму? Или вы хотите обновить существующую диаграмму на слайде?

Tanaike 16.06.2024 03:11

Например, пользователь1 набрал за экзамен 40% баллов, а пользователь2 — 80%. Когда каждый пользователь просматривает/загружает отчет, я хочу отображать оценки на диаграмме (пользователь будет видеть только свои оценки на диаграмме)

Dula 17.06.2024 01:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец, после многих поисков я нашел решение.

Сначала вам необходимо обновить значения 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;
}

Другие вопросы по теме