Как вставить строку и изменить стили ячеек, используя batch_update в gspread? - PullRequest
2 голосов
/ 20 января 2020

Я использую gspread и gspread_formatting для обновления своих листов в Google. Некоторая часть моей кодовой базы была переработана для использования batch_update, потому что я нашел несколько примеров кода в другом ответе, который я мог бы использовать в качестве ссылки. Тем не менее, я не могу преобразовать две другие операции. Вот мой код:

import gspread

from gspread_formatting import *
from oauth2client.service_account import ServiceAccountCredentials

def operate():
    scope = [
        'https://spreadsheets.google.com/feeds',
        'https://www.googleapis.com/auth/drive'
    ]
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        'creds.json',
        scope
    )
    gc = gspread.authorize(credentials)

    sh = gc.open('My spreadsheet')
    ws = sh.sheet1
    sheet_id = ws._properties['sheetId']

    # Setting the column sizes
    body = {
        'requests': [
            {
                'updateDimensionProperties': {
                    'range': {
                        'sheetId': sheet_id,
                        'dimension': 'COLUMNS',
                        'startIndex': 0,
                        'endIndex': 10
                    },
                    'properties': {
                        'pixelSize': 150
                    },
                    'fields': 'pixelSize'
                }
            },
            {
                'updateDimensionProperties': {
                    'range': {
                        'sheetId': sheet_id,
                        'dimension': 'COLUMNS',
                        'startIndex': 4,
                        'endIndex': 6
                    },
                    'properties': {
                        'pixelSize': 250
                    },
                    'fields': 'pixelSize'
                }
            }
        ]
    }
    res = sh.batch_update(body)

    # Request 1
    ws.insert_row(['One', 'Two', 'Three'], 1)

    # Request 2
    format_cell_range(
        ws, 'A1:Z7',
        cellFormat(
            wrapStrategy='WRAP',
            verticalAlignment='MIDDLE',
            backgroundColor=color(0.886, 0.945, 0.988),
            textFormat=textFormat(
                foregroundColor=color(0, 0.129, 0.443),
                fontFamily='Roboto',
                bold=True
            )
        )
    )

Итак, я хочу как-то добавить запрос 1 и запрос 2 в метод bulk_update. Можно ли вставить и строку и изменить форматирование с помощью bulk_update? Если да, как я могу это сделать? Спасибо за любую помощь.

1 Ответ

2 голосов
/ 21 января 2020
  • Вы хотите вставить новую строку в 1-ю строку.
  • Вы хотите поместить значения ['One', 'Two', 'Three'] во вставленную строку.
  • Вы хотите установите следующий формат ячейки для диапазона «A1: Z7», используя метод batch_update() gspread.

    wrapStrategy='WRAP',
    verticalAlignment='MIDDLE',
    backgroundColor=gsf.color(0.886, 0.945, 0.988),
    textFormat=gsf.textFormat(
        foregroundColor=gsf.color(0, 0.129, 0.443),
        fontFamily='Roboto',
        bold=True
    )
    
  • Вы хотите добиться этого, используя gspread с python .

    • Ваша цель - преобразовать следующий скрипт в batch_update()

      # Request 1
      ws.insert_row(['One', 'Two', 'Three'], 1)
      
      # Request 2
      format_cell_range(
          ws, 'A1:Z7',
          cellFormat(
              wrapStrategy='WRAP',
              verticalAlignment='MIDDLE',
              backgroundColor=color(0.886, 0.945, 0.988),
              textFormat=textFormat(
                  foregroundColor=color(0, 0.129, 0.443),
                  fontFamily='Roboto',
                  bold=True
              )
          )
      )
      
  • Вы уже были возможность получать и вводить значения для электронных таблиц с помощью API Sheets.

Если мое понимание правильное, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Поток:

В этом случае поток тела запроса batch_update() выглядит следующим образом.

  1. Вставить новую строку в 1-ю строку с помощью insertDimension.
  2. Поместить значения ['One', 'Two', 'Three'] во вставленную строку с помощью updateCells.
  3. Установить формат ячейки для диапазона "A1: Z7" repeatCell.

Модифицированный скрипт:

spreadsheetId = "###"  # Please set the Spreadsheet ID.
sheetName = "###"  # Please set the sheet name.

sh = gc.open_by_key(spreadsheetId)
ws = sh.worksheet(sheetName)
sheetId = ws._properties['sheetId']
requests = {
    "requests": [
        {
            "insertDimension": {
                "range": {
                    "sheetId": sheetId,
                    "startIndex": 0,
                    "dimension": "ROWS",
                    "endIndex": 1
                }
            }
        },
        {
            "updateCells": {
                "range": {
                    "sheetId": sheetId,
                    "startRowIndex": 0,
                    "endRowIndex": 1
                },
                "rows": [
                    {
                        "values": [
                            {
                                "userEnteredValue": {
                                    "stringValue": "One"
                                }
                            },
                            {
                                "userEnteredValue": {
                                    "stringValue": "Two"
                                }
                            },
                            {
                                "userEnteredValue": {
                                    "stringValue": "Three"
                                }
                            }
                        ]
                    }
                ],
                "fields": "userEnteredValue"
            }
        },
        {
            "repeatCell": {
                "range": {
                    "sheetId": sheetId,
                    "startRowIndex": 0,
                    "endRowIndex": 7,
                    "startColumnIndex": 0,
                    "endColumnIndex": 26
                },
                "cell": {
                    "userEnteredFormat": {
                        "wrapStrategy": "WRAP",
                        "verticalAlignment": "MIDDLE",
                        "backgroundColor": {
                            "red": 0.886,
                            "green": 0.945,
                            "blue": 0.988
                        },
                        "textFormat": {
                            "foregroundColor": {
                                "red": 0,
                                "green": 0.129,
                                "blue": 0.443
                            },
                            "fontFamily": "Roboto",
                            "bold": True
                        }
                    }
                },
                "fields": "userEnteredFormat"
            }
        }
    ]
}
res = sh.batch_update(requests)

Примечание:

  • Я понял, что bulk_update batch_update.

Ссылки:

Если я неправильно понял ваш вопрос и это был не тот результат, который вы хотите, я приношу свои извинения.

...