Обновить форматирование одной строки для всего листа - PullRequest
0 голосов
/ 28 августа 2018

Я хочу просто применить форматирование из JSON Entry. Первым делом я сделал желаемый формат в своей электронной таблице для второго ряда всех столбцов. Затем я получил их с помощью запроса .get (от A2 до AO3).

request = google_api.service.spreadsheets().get(
    spreadsheetId=ss_id,
    ranges="Tab1!A2:AO3",
    includeGridData=True).execute()

Следующее, что я сделал, это собрал каждый из форматов для каждого столбца и записал их в словарь.

my_dictionary_of_formats = {}
row_values = row_1['sheets'][0]['data'][0]['rowData'][0]['values']
for column in range(0, len(row_values)):
    my_dictionary_of_formats[column] = row_values[column]['effectiveFormat']

Теперь у меня есть словарь всех моих эффективных форматов для всех моих столбцов. У меня возникли проблемы с применением этого формата ко всем строкам в каждом столбце. Я попытался batchUpdate запрос:

cell_data = {
  "effectiveFormat": my_dictionary_of_formats[0]}

row_data = {
  "values": [
      cell_data
  ]
}

update_cell = {
  "rows": [
       row_data
  ],
  "fields": "*",
  "range": 
    {
      "sheetId": input_master.tab_id,
      "startRowIndex": 2,
      "startColumnIndex": 0,
      "endColumnsIndex": 1
    }
}

request_body = {
  "requests": [
      {"updateCells": update_cell}],
  "includeSpreadsheetInResponse": True,
  "responseIncludeGridData": True}

service.spreadsheets().batchUpdate(spreadsheetId=my_id, body=request_body).execute()

Это уничтожило все, и я не уверен, почему. Я не думаю, что понимаю атрибут fields='*.

TL; DR Я хочу применить формат ко всем строкам в одном столбце. Так же, как если бы я использовал инструмент «Формат краски» во втором ряду, первом столбце и перетащил его до последнего ряда.

----- Обновление

Привет, благодаря комментариям это было мое решение:

###collect all formats from second row
import json
row_2 = goolge_api.service.spreadsheets().get(
    spreadsheetId=spreadsheet_id,
    ranges="tab1!A2:AO2",
    includeGridData=True).execute()
my_dictionary = {}
row_values = row_2['sheets'][0]['data'][0]['rowData'][0]['values']
for column in range(0,len(row_values)):
    my_dictionary[column] = row_values[column]
json.dumps(my_dictionary,open('config/format.json','w'))

###Part 2, apply formats
requests = []
my_dict = json.load(open('config/format.json'))
for column in my_dict:
    requests.append(

    {
      "repeatCell": {
        "range": {
            "sheetId": tab_id,
            "startRowIndex": str(1),
            "startColumnIndex":str(column),
            "endColumnIndex":str(int(column)+1)
    },
       "cell": {
          "userEnteredFormat": my_dict[column]
    },
        'fields': "userEnteredFormat({})".format(",".join(my_dict[column].keys()))
        }
    })

body = {"requests": requests}
google_api.service.spreadsheets().batchUpdate(spreadsheetId=s.spreadsheet_id,body=body).execute()

1 Ответ

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

Когда вы включаете fields в качестве части запроса, вы указываете конечной точке API, что она должна перезаписать указанные поля в целевом диапазоне информацией, найденной в загруженном ресурсе. fields="*" соответственно интерпретируется как «Этот запрос определяет все данные и метаданные данного диапазона. Удалите все предыдущие данные и метаданные из диапазона и используйте вместо этого то, что предоставлено».

Таким образом, все, что не указано в ваших updateCells запросах, будет удалено из range, указанного в запросе (например, значения, формулы, проверка данных и т. Д.).

Вы можете узнать больше в справочнике по batchUpdate

Для запроса updateCell параметр fields такой, как описано:

Поля CellData, которые должны быть обновлены. Необходимо указать хотя бы одно поле. Корень это CellData; "row.values. не должно быть указано Один «*» может использоваться как сокращение для перечисления каждого поля.

Если вы затем просмотрите описание ресурса CellData, вы увидите следующие поля:

  • "userEnteredValue"
  • "effectiveValue"
  • "FormattedValue"
  • "userEnteredFormat"
  • "effectiveFormat"
  • "гиперссылка"
  • "примечание"
  • "textFormatRuns"
  • "dataValidation"
  • "сводная таблица"

Таким образом, правильная спецификация полей для вашего запроса, вероятно, будет fields="effectiveFormat", так как это единственное поле, которое вы указываете в свойстве row_data.

Также рассмотрите возможность использования repeatCell запроса , если вы просто указываете один формат.

...