Как обновить листы Google с помощью API Google, используя python? - PullRequest
0 голосов
/ 09 апреля 2020
from __future__ import print_function
import pandas as pd
from datetime import date
from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
import gspread
import df2gspread

SPREADSHEET_ID = 'spreadsheet id'
RANGE_NAME = "A1:S3"



def get_google_sheet(spreadsheet_id, range_name):
# Retrieve sheet data using OAuth credentials and Google Python API.

global scopes
global creds
global store
global flow
global service
global gsheet

scopes = 'https://www.googleapis.com/auth/spreadsheets'
# Setup the Sheets API
store = file.Storage('credentials.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_secret.json', 
scopes)
    creds = tools.run_flow(flow, store)
service = build('sheets', 'v4', http=creds.authorize(Http()))

# Call the Sheets API
gsheet = 
service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, 
range=range_name).execute()

return gsheet

def gsheet2df(gsheet):
# Converts Google sheet data to a Pandas DataFrame.

header = gsheet.get('values', [])[0]   # Assumes first line is header!
values = gsheet.get('values', [])[1:]  # Everything else is data.
#header = values[0]
if not values:
    print('No data found.')
else:
    df = pd.DataFrame.from_records(values)
    df.columns = header

    return df

global df

def Export_Data_To_Sheets():


    response_date = service.spreadsheets().values().update(
        spreadsheetId=SPREADSHEET_ID,
        valueInputOption='RAW',
        range=RANGE_NAME,
        body=dict(
            majorDimension='ROWS',
            values=df.T.reset_index().T.values.tolist())
    ).execute()
    print('Sheet successfully Updated')



gsheet = get_google_sheet(SPREADSHEET_ID, RANGE_NAME)
df = gsheet2df(gsheet)

email_list = df
names = email_list['email']

for name in names:
name = 'test'
Export_Data_To_Sheets()

Когда я пытаюсь обновить / добавить ячейку или ячейки в листах Google, я получаю эту ошибку: Traceback (последний вызов был последним): Файл "/ Users / adaniels / PycharmProjects / EmailAutomation / venv / AutoEmailScript / FranEmails. py ", строка 167, в файле Export_Data_To_Sheets ()" /Users/adaniels/PycharmProjects/EmailAutomation/venv/AutoEmailScript/FranEmails.py ", строка 66, в файле export_Data_To_Sheets response_date = service.spreadsheets (). "/Users/adaniels/PycharmProjects/EmailAutomation/venv/lib/python3.8/site-packages/googleapiclient/_helpers.py", строка 130, в файле positional_wrapper возвращено в обернутом виде (* args, ** kwargs) Файл "/ Users /adaniels/PycharmProjects/EmailAutomation/venv/lib/python3.8/site-packages/googleapiclient/http.py ", строка 840, в execute вызывает HttpError (соответственно, content, uri = self.uri) googleapiclient.errors. HttpError: https://sheets.googleapis.com/v4/spreadsheets/13R_wIcWrX9Xa6ZURnLtuHK5czRfTKVakk6nOWkTjRqA/values/A1%3AS3?valueInputOption=RAW&alt=json возвращено «Запрос имеет недостаточные области проверки подлинности.»>

Процесс завершен с кодом выхода 1

1 Ответ

0 голосов
/ 22 апреля 2020

Ошибка "Request had insufficient authentication scopes." связана с тем, что необходимые области не были найдены .

В вашем случае вы должны объявить свои области видимости следующим образом:

scopes = ['https://www.googleapis.com/auth/spreadsheets']

Если вы добавили любые новые области действия или изменили существующие, вы должны удалить уже существующий файл credentials.json, так как этот файл содержит аутентификацию для предыдущих областей, отсюда и указанная выше ошибка.

Ссылка

...