Как обновить ячейки в электронной таблице Google с помощью распространенного в Python wks.update_cells - PullRequest
0 голосов
/ 12 января 2020

У меня есть do c в GS с автоматически загруженными данными со значениями цифр c в строковом формате. Во всех ячейках есть метка, поэтому я могу превратить строки в числа, удалив ее.

enter image description here

Он успешно работает, когда для обновления используется метод gspread одна ячейка: wks.update_acell("B7", str(1939.0).replace("'"," "))

Но я хочу поменять все ячейки в диапазоне с помощью wks.update_cells.

В официальных документах для взрослых есть пример:

cell_list = wks.range('A1:C7')

for cell in cell_list:
    cell.value = 'O_o'

# Update in batch
wks.update_cells(cell_list)

В этой форме это работает, но в моем случае с cell.value = str.replace("'","") я получаю ошибку:

TypeError: replace() takes at least 2 arguments (1 given)

Я думаю, что мне нужно поместить что-то в круглые скобки str (). Заменить - но не понимаю, что ... Может Кто-нибудь, помогите мне, пожалуйста?

PS Полный код:

import pandas as pd
import numpy as np
from pandas import Series,DataFrame
from file4dir1 import rep


    pd.set_option('display.max_columns',None)
    pd.set_option('display.expand_frame_repr',False)
    pd.set_option('max_colwidth',-1)

    mytoken='***'
    project = '***'

    DateFrom="2019-12-01"
    DateTo="2019-12-31"

    data=rep(mytoken,project,DateFrom,DateTo)

    file=open("cashe3.csv","w")
    file.write(data)
    file.close()
    f=pd.read_csv("cashe3.csv", header=1, sep=' ',index_col=0,parse_dates=True)

import googleapiclient.discovery
import argparse
from apiclient import discovery
from oauth2client import client
from oauth2client import tools  

    SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
    CLIENT_SECRET_FILE = "myGSapp4.json"
    APPLICATION_NAME = 'Google Sheets API Report'
    credential_path = 'sheets.googleapis.com-report.json'

from httplib2 import Http
from oauth2client.file import Storage   

    store = Storage(credential_path)
    credentials = store.get()
    parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, parents=[tools.argparser])
    flags = parser.parse_args([])
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        print('Storing credentials to ' + credential_path)

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build
from httplib2 import Http


import gspread
from df2gspread import df2gspread as d2g     

    spreadsheet_key = '***'
    wks_name = 'Sheet0'
    d2g.upload(f, spreadsheet_key, wks_name, credentials=credentials, row_names=True)

# индексы строк и столбцов, например

    gc = gspread.authorize(credentials)
    wks_name = gc.open_by_key('***').get_worksheet(0)
    cell_list = wks_name.range('E7:E13')
    requests = {
        "requests": [
            {
                "findReplace": {
                    "range": {
                        "sheetId": 'Sheet0',
                        "startRowIndex": 7,
                        "endRowIndex": 13,
                        "startColumnIndex": 5,
                        "endColumnIndex": 5
                    },
                    "find": "^'",
                    "searchByRegex": True,
                    "includeFormulas": True,
                    "replacement": ""
                }
            }
        ]
    }

    wks_name.update_cells(cell_list)

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Вместо этого вы можете использовать Библиотеку Sheetfu и ее модуль Table для этого конкретного случая.

from sheetfu import SpreadsheetApp
from sheetfu import Table

spreadsheet = SpreadsheetApp('path/to/secret.json').open_by_id('<spreadsheet id>')
data_range = spreadsheet.get_sheet_by_name('sheet name').get_data_range()

table = Table(data_range)

for item in table:
    impression_value = item.get_field_value('Impressions')
    if impression_value[0] = "'":
        impression_value = impression_value[1:]
        item.get_set_value('Impressions', impression_value)

table.commit()

Это должно сработать.

Вы также можете разыграть Значение показа, которое должно быть передано перед отправкой на лист, затем будет обработано и помещено в число как число.

Метод set фактически не вносит никаких изменений. Хранит запрос только на уровне таблицы. Это сделано в целях повышения производительности, чтобы избежать запроса API к каждой строке, которую необходимо обновить. Вместо этого мы создаем пакет запросов, которые отправляются все вместе в Spreadsheet API, используя table.commit().

0 голосов
/ 12 января 2020
  • Вы хотите удалить одинарную кавычку ' в верхней части значения в каждой ячейке, используя символ python.
  • Вы уже смогли получить и поместить значения для таблицы Google Spreadsheet. используя Sheets API.

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

Точка модификации:

  • Чтобы убрать одиночную кавычку ' вверху значения в каждой ячейке, в В этом ответе я использую «FindReplaceRequest» по методу batch_update gspread. Используя «FindReplaceRequest», значения в диапазоне заменяются.

Я думал, что этот способ проще. Поэтому я предложил это.

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

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

spreadsheet = client.open_by_key(spreadsheetId)
sheetId = spreadsheet.worksheet(sheetName)._properties['sheetId']
requests = {
    "requests": [
        {
            "findReplace": {
                "range": {
                    "sheetId": sheetId,
                    "startRowIndex": 0,
                    "endRowIndex": 7,
                    "startColumnIndex": 0,
                    "endColumnIndex": 3
                },
                "find": "^'",
                "searchByRegex": True,
                "includeFormulas": True,
                "replacement": ""
            }
        }
    ]
}
spreadsheet.batch_update(requests)
  • В этом случае значения ячеек "A1: C7" заменяются. Это из сценария в вашем вопросе.

Примечание:

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

    requests = {
        "requests": [
            {
                "findReplace": {
                    "sheetId": sheetId,
                    "find": "^'",
                    "searchByRegex": True,
                    "includeFormulas": True,
                    "replacement": ""
                }
            }
        ]
    }
    

Ссылки:

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

...