Как обновить файлы Google Drive - PullRequest
1 голос
/ 29 января 2020

Вот что я пытаюсь сделать:

data = drive.files().get_media(fileId=fileId).execute()
csvData = [row.split(",") for row in str(data, 'latin-1').split("\n")]
ar = []
temp = []
for i, row in enumerate(csvData):
    if "".join(row) != "":
        temp.append(row)
    else:
        ar.append(temp)
        temp = []
    if i == len(csvData) - 1:
        ar.append(temp)

# Create request body for the method of spreadsheets.create of Sheets API. [Tanaike]
sheetsObj = []
for sheet in ar:
    tempRow = []
    for row in sheet:
        tempCol = []
        for col in row:
            tempCol.append({"userEnteredValue": {"stringValue": col}})
        if len(tempCol) != 0:
            tempRow.append({"values": tempCol})
    if len(tempRow) != 0:
        sheetsObj.append({"data": [{"rowData": tempRow}]})

# Request to Sheets API. [Tanaike]
body = {"properties": {"title": "spreadsheetTitle"}, "sheets": sheetsObj}
res = sheets.spreadsheets().create(body=body).execute()
print(res)

Я недавно задал вопрос о загрузке файлов на Google Drive через Google API. Я успешно справился с кодом, но теперь я понял, что мне нужен отдельный код, который вместо загрузки данных в новый файл обновляет существующие листы Google.

Я боролся с batchUpdate () ( https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate), потому что я не знаю, как вписать в него мое старое решение для sheetObj.

Идея такая же, как здесь: Форматирование документов Google, преобразование тексты на листы

Я sh, чтобы обновить существующий файл листов Google с данными в формате .txt, но вместо простой загрузки и создания новых файлов, я sh, чтобы обновить существующие файлы листов Google, которые у меня есть в настоящее время.

  • Идея состоит в том, чтобы перезаписать все, что находится в существующих файлах. Предположим, что идентификатор файла известен.

ps .: Там происходит нечто странное, чего я раньше не замечал: все ячейки начинаются с ', я пытаюсь разобраться с этим, но если кто-то выяснит это раньше меня, включите это в решение.

1 Ответ

2 голосов
/ 30 января 2020
  • Вы хотите обновить существующую электронную таблицу, используя данные CSV из следующих значений. Значения: Форматирование документов Google, преобразование текстов в листы

    ID, NAME, MOBILE, CITY, COUNTRY, BIRTHDAY, 
    3, NameGoesHere1, 21 98658 5548, abcity, countryNameHere, 1998-05-02, 
    6, SomeoneElse Joined Here, 21 98535 1218, whereland, Far far away, 1989-11-15, 
    5, AnotherCustomer, 21 85482 5245, somecity, Somewhereland, 1999-08-04, 
    
    ID, PRICE, STOCK, ASDF, BASDF, CASDF,
    
    ID, NAME, PRICE, DESCRIPTION, 
    2, pen, 1.5, The pen is mightier than the sword, 
    3, pencil, 1.0, Can be used to write, 
    4, RPG, 150.0, well that escalated quickly, huh, 
    
    EMPTY, 
    names, 
    goofs, 
    
    ID, FLAVOR, 
    
  • Существующая электронная таблица имеет 5 листов для обновления с использованием данных CSV для 5 листов.

  • Вы хотите добиться этого с помощью google-api- python -клиента с python.
  • Вы уже можете получать и размещать значения для электронной таблицы с помощью API-интерфейса Sheets.

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

Поток:

  1. Извлечение значений из файла CSV.
  2. Анализ значений для каждого листа, и создайте тело запроса.
  3. Запрос к существующей электронной таблице с созданным телом запроса.
    • В этом случае я использовал метод spreadsheets.values.batchUpdate.

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

Перед запуском скрипта Пожалуйста, установите переменные csvFileId, spreadsheetId и sheetNames.

csvFileId = '###'  # Please set the CSV file ID.
spreadsheetId = '###'  # Please set the Spreadsheet ID.
sheetNames = ['Sheet1', 'Sheet2', 'Sheet3', 'Sheet4', 'Sheet5']  # Please set the sheet names in the Spreadsheet for updating.

sheets = build('sheets', 'v4', credentials=creds)
drive = build('drive', 'v3', credentials=creds)

# Retrieve data from Google Drive and parse data as an array.
data = drive.files().get_media(fileId=csvFileId).execute()
csvData = [row.split(",") for row in str(data, 'utf-8').split("\n")]
ar = []
temp = []
for i, row in enumerate(csvData):
    if "".join(row) != "":
        row = [v.strip() for v in row]
        temp.append(row)
    else:
        ar.append(temp)
        temp = []
    if i == len(csvData) - 1:
        ar.append(temp)

valuesUpdateReq = []
for i, sheet in enumerate(ar):
    if bool(sheet):
        sheetName = sheetNames[i]
        valuesUpdateReq.append({"values": sheet, "range": sheetName, "majorDimension": "ROWS"})

# Request to Sheets API.
batch_update_values_request_body = {"data": valuesUpdateReq, "valueInputOption": "USER_ENTERED"}
res = sheets.spreadsheets().values().batchUpdate(spreadsheetId=spreadsheetId, body=batch_update_values_request_body).execute()
print(res)

Примечание:

  • В приведенном выше сценарии значения помещаются в электронную таблицу с "USER_ENTERED". Таким образом, значения могут быть проанализированы как строка, число и дата. Кроме того, одиночная кавычка верхней части символа не используется.

Ссылка:

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

...