Google Sheets - Настройка цвета фона - PullRequest
0 голосов
/ 29 августа 2018

Я пишу приложение, ранее принадлежавшее другому разработчику. После определенной обработки он захотел заполнить файл Google Sheets значениями. Прежде чем он смог начать разработку, он ушел, оставив мне задачу разобраться с библиотекой google-api-client-php.

Мне удается вставить значения (это был большой шаг для меня), но я хотел бы добавить цвет фона для определенных ячеек. Я не нашел способа добиться этого ...

Пока вот как я вставляю значения:

class Sheet {
    public function __construct($client) {
        $this->service = new \Google_Service_Sheets($client);
    }
    public function write($line, $newValues, $startColumn)
    {
        $values = new \Google_Service_Sheets_ValueRange();
        $values->setValues([    $newValues  ]); 

        $this->service->spreadsheets_values->update($this->id, $range, $values, ['valueInputOption' => 'USER_ENTERED']);
    }
}

И я хотел бы создать функцию colorLine().

Вот моя первая попытка:

 public function colorLine($line, $r, $g, $b, $a = 1) {
   $myRange = [
        'sheetId' => 1,
        'startRowIndex' => $line,
        'endRowIndex' => $line,
        'startColumnIndex' => 0,
        'endColumnIndex' => 1000,
    ];

    $requests = [
        new \Google_Service_Sheets_Request([
            'addConditionalFormatRule' => [
                'rule' => [
                    'ranges' => [ $myRange ],
                    'booleanRule' => [
                        'condition' => [
                            'type' => 'CUSTOM_FORMULA',
                            'values' => [ [ 'userEnteredValue' => '=1' ] ]
                        ],
                        'format' => [
                            'backgroundColor' => [ 'red' => $r, 'green' => $g, 'blue' => $b ]
                        ]
                    ]
                ],
                'index' => 1
            ]
        ])
    ];

    $batchUpdateRequest = new \Google_Service_Sheets_BatchUpdateSpreadsheetRequest([
        'requests' => $requests
    ]);
    $response = $this->service->spreadsheets->batchUpdate($this->id,
        $batchUpdateRequest);
}

Во-первых, я даже на самом деле не понимаю, что я написал ... Плюс, он говорит "Недопустимые запросы [0] .addConditionalFormatRule: Нет сетки с идентификатором: 1", но это не так. это плохо, я не думаю, что это сделало бы то, что я ищу.

Я думаю, что это создаст "условный формат", но я просто хочу фон ... Этот API выглядит очень сложным для простых приложений ...

В любом случае! Если бы кто-то мог мне помочь, я был бы очень благодарен!

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Наконец-то я нашел для этого рабочее решение.

$sheetId = $service->spreadsheets->get($spreadsheetId, ['ranges' => 'worksheetname']);

//For range, end rows and end columns are not considered for updating. Index start from 0
//Here we are setting range for A3:E5 grid
$range = new Google_Service_Sheets_GridRange();
$range->setSheetId($sheetId->sheets[0]->properties->sheetId);
$range->setEndRowIndex(2);
$range->setEndRowIndex(5);
$range->setStartColumnIndex(0);
$range->setEndColumnIndex(5);

//set the color value in RGBA
$color = new Google_Service_Sheets_Color();
$color->setRed($red / 255);
$color->setGreen($green / 255);
$color->setBlue($blue / 255);
$color->setAlpha($alpha);

//cellFormat is used to set different properties of a cell
$cellFormat = new Google_Service_Sheets_CellFormat();

//textFormat is used to set different text formats like Bold
$textFormat = new Google_Service_Sheets_TextFormat();
$textFormat->setBold(true);
$cellFormat->setBackgroundColor($color);
$cellFormat->setTextFormat($textFormat);

//New cell class. Assign the cellFormat to it
$cell = new Google_Service_Sheets_CellData();
$cell->setUserEnteredFormat($cellFormat);

//repeatCell request is used to assign requests to range of cells
$repeatCell = new Google_Service_Sheets_RepeatCellRequest();
$repeatCell->setRange($range);

//Fields is used to specify which properties of a cell to update
//Here we are updating two properties. So both are specified and seperated by comma ,
$repeatCell->setFields('userEnteredFormat.textFormat.bold,userEnteredFormat.backgroundColor');

//Set repeatCellrequest to the requests class
$requests = new Google_Service_Sheets_Request();
$requests->setRepeatCell($repeatCell);

//requests are set to batchupdatespreadsheetrequest class
$batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest();
$batchUpdateRequest->setRequests($requests);

//Finally batchUpdate is called to update the format of cells
$response = $service->spreadsheets->batchUpdate($spreadsheetId, $batchUpdateRequest, []);

Для более подробного видео

0 голосов
/ 31 августа 2018

Если вам не нужны объяснения, просто перейдите к последнему разделу:)

Возможно, это не лучшее решение, но, по крайней мере, оно сработало.

Объяснение решения (TL, NR):

Что нам нужно?

  1. Значения RGBa, которые мы хотим
  2. Диапазон (sheetId, индекс строки, столбцы индекс)
  3. Идентификатор электронной таблицы.

Теперь, как нам действовать? Ну, предыдущий исходный код не был настолько плохим на самом деле ... Просто нужно немного его изменить:

  • Мы не хотим создавать условные форматы, а должны обновлять ячейки, поэтому мы должны использовать запрос « repeatCell » (я объясню, почему вместо « repeatCell ») updateCell")
  • В этом запросе у нас может быть 3 параметра:
    • поле маски (которое ограничивает обновления),
    • диапазон
    • клетка. Это объект CellData , который может содержать "userEnteredFormat" ( CellFormat ) И СЕЙЧАС у вас есть доступ к свойству backgroundColor !!

Начать кодирование:

Хорошо, давайте определим диапазон:

Вы не можете иметь «начало» и «конец» в одной и той же позиции (так что -1 в начале, это изменит только одну строку)

    $myRange = [
        'sheetId' => $sheetId,
        'startRowIndex' => $line-1,
        'endRowIndex' => $line,
        'startColumnIndex' => 0,
        'endColumnIndex' => 17,
    ];

Теперь давайте определим цвет (каждый компонент должен быть между 0 и 1):

    $format = [
        "backgroundColor" => [
            "red" => $r,
            "green" => $g,
            "blue" => $b,
            "alpha" => $a,
        ],
    ];

И это все, мы почти готовы!

Мы просто должны сообщить службе, что нам нужен запрос " repeatCell ". Не забудьте параметр «поля». Если вы не ограничите обновление, все данные ячейки изменятся, , включая текст ! В этом случае путь к «полям» начинается с «ячейки», поэтому мы просто набираем 'userEnteredFormat.backgroundColor' . Затем используйте переменную $ format, созданную ранее.

    $requests = [
        new \Google_Service_Sheets_Request([
            'repeatCell' => [
                'fields' => 'userEnteredFormat.backgroundColor',
                'range' => $myRange,
                'cell' => [
                    'userEnteredFormat' => $format,
                ],
            ],
        ])
    ];

OK! Готово. Теперь включите этот (или эти) запрос в пакет:

    $batchUpdateRequest = new \Google_Service_Sheets_BatchUpdateSpreadsheetRequest([
        'requests' => $requests
    ]);

И, наконец, отправьте запрос с услугой, включите идентификатор таблицы ($this->id в моем случае).

    $response = $this->service->spreadsheets->batchUpdate($this->id,
        $batchUpdateRequest);

Полное решение:

Спасибо за чтение, есть ваше решение:

public function colorLine($line, $r, $g, $b, $a = 1.0, $worksheetName = null)
{
    if($r > 1) $r = Tools::rescale($r, 0, 255, 0, 1);
    if($g > 1) $g = Tools::rescale($g, 0, 255, 0, 1);
    if($b > 1) $b = Tools::rescale($b, 0, 255, 0, 1);
    if($a > 1) $a = Tools::rescale($a, 0, 255, 0, 1);

    $worksheetName = ($worksheetName ? : $this->defaultWorksheet);
    $sheetId = $this->getWorksheetId($worksheetName);

    $myRange = [
        'sheetId' => $sheetId,
        'startRowIndex' => $line-1,
        'endRowIndex' => $line,
        'startColumnIndex' => 0,
        'endColumnIndex' => 17,
    ];
    $format = [
        "backgroundColor" => [
            "red" => $r,
            "green" => $g,
            "blue" => $b,
            "alpha" => $a,
        ],
    ];

    $requests = [
        new \Google_Service_Sheets_Request([
            'repeatCell' => [
                'fields' => 'userEnteredFormat.backgroundColor',
                'range' => $myRange,
                'cell' => [
                    'userEnteredFormat' => $format,
                ],
            ],
        ])
    ];

    $batchUpdateRequest = new \Google_Service_Sheets_BatchUpdateSpreadsheetRequest([
        'requests' => $requests
    ]);
    $response = $this->service->spreadsheets->batchUpdate($this->id,
        $batchUpdateRequest);
}
...